Nginx用rsyslog转发日志的一些小坑

有运维或运维开发方面的需求,可以联系博主QQ 452336092或Email:admin#centos.bz(收费)

我们从Nginx的代码中可以看到,给syslog发通知的时候,tag后面跟了2个字符 冒号+空格,所以阿里云这里的文档完全是坑爹

if $syslogtag == 'nginx' then @@10.101.166.173:11111;ALI_LOG_FMT

这里判断的是$syslogtag,也就是这种配置

access_log syslog:server=ip:port,facility=local7,tag=nginx,severity=info combined;

这边配置tag为 nginx,而 $syslogtag 不会是 nginx,而是 nginx+冒号+空格

查了rsyslog文档,$syslogtag 的行为本来就是程序自己定的,(),真正需要的是 这个 $programname

所以这样的配置是可以work的:

cat /etc/rsyslog.d/nginx.conf

input(type="imuxsock" Socket="/var/log/nginx.sock" CreatePath="on")
# $template ALI_LOG_FMT,"2.3 streamlog_tag %timegenerated:::date-unixtimestamp% %fromhost-ip% %pri-text% %app-name% %syslogtag% %msg:::drop-last-lf%\n"
template(name="ALI_LOG_FMT" type="string" string="2.3 streamlog_tag %timegenerated:::date-unixtimestamp% %fromhost-ip% %pri-text% %app-name% %syslogtag% %msg:::drop-last-lf%\n")
if $programname == 'nginx' then @@127.0.0.1:11111;ALI_LOG_FMT
& ~

注意,最后的那个 $ ~ 表示被上条规则匹配的日志不在发送到别的地方,因为nginx的默认的facility 是 local7 和boot.log是一样的,会造成发送日志的同时 也写入到boot.log ,造成boot.log巨大,这也是一个坑点。

另外其实,可以自己配置nginx的日志格式 满足ilogtail的采集规则,这样可以少走一次rsysylog。这里的 streamlog_tag 对应阿里云的syslog采集日志的时候的log tag.

原文出处:ihipop -> http://blog.ihipop.info/2017/09/4973.html

打赏

如果此文对你有所帮助,请随意打赏鼓励作者^_^