我们从Nginx的代码中可以看到,给syslog发通知的时候,tag后面跟了2个字符 冒号+空格,所以阿里云这里的文档完全是坑爹
1 |
if $syslogtag == 'nginx' then @@10.101.166.173:11111;ALI_LOG_FMT |
这里判断的是$syslogtag,也就是这种配置
1 |
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
1 2 3 4 5 |
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.