我很难debugging一个问题,我认为这可能是双重的 – 两个独立的程序出现问题。
主要的问题是,我在Ubuntu 14.04上将nginxlogging到系统日志中,如下所示:
access_log syslog:server=unix:/dev/log,tag=nginx,facility=local7,severity=info combined
我希望能够过滤标记为nginx的消息,但没有这样的运气。
filter nginx { facility(local7) and tags("nginx") }
更改和,或工作,或只是删除标签部分,作为设施filter工作正常。 但是,标签filter不会。
所以,我想用loggertesting并设置一个基本的testing:
template nginx { template("timestamp=${ISODATE} host=${HOST} tags=${TAGS} msgheader=${MSGHDR} ${MSG}\n"); template-escape(no); }; filter nginx { tags("nginx"); }; destination nginx { file("/tmp/nginx.log" template(nginx)); }; log { source(s_net); filter(nginx); destination(nginx); };
–
$ logger -n localhost -P 10001 -t nginx -p local7.info -u /tmp/ignored testing 123
我有一个源,s_net,在端口10001上的UDP侦听此testing。 使用logging器,我通过UDPlogin到该端口,使用local7工具和信息的严重性标记为“nginx”,并且再次过滤不起作用。 删除filter的约束,让消息传递到目的地,就像直接与nginx一样。 标签不起作用。
而且,这个标签不会出现在$ TAGSmacros中,而是出现在$ MSGHDRmacros中。
注意: / tmp / ignored是logger <2.0.2中的一个解决方法,如果你不提供一个套接字,它根本不会写入TCP / UDP端口,所以提供一个伪标记可以使它工作
看来,即使使用logging器,我不能过滤传入的标签。
我对syslog(特别是syslog-ng)相对来说比较陌生,所以也许我缺less一些东西? 文档似乎很稀疏,但是这看起来像一个非常简单的用例。 有没有人看到有什么特别的错误,或者我可能误解了标签的用途?
syslog-ng中的标签是可以显式添加到消息中的内部标签(例如源代码),或者从消息中parsing。
我不知道logging器中的nginx标记或access_logconfiguration如何影响消息本身,但我想syslog-ng不parsing它。
在没有看到示例消息的情况下,我可以为此问题提出以下可能的解决方法:
HTH
问候,
罗伯特
在RFC3164中定义的TAG字段(nginxconfiguration参数引用的)和Syslog-ng中使用的标记filter之间有区别。
您可以在Nginx中定义的TAG字段被解释为正在logging当前消息的程序或进程。 它位于syslog数据包的MSG部分,并由第一个非字母数字字符终止。 之后的所有内容将被用作实际的消息(RFC3164#section-4.1.3)。
你可以看到,当你嗅探系统日志stream量例如tcpdump:
tcpdump -A -vvv -s0 -n -i venet0 port 514
这是一个来自NGINX的例子,configuration如下:
15:25:16.477717 IP (tos 0x0, ttl 63, id 22206, offset 0, flags [DF], proto UDP (17), length 454) loadbalancer.example.com.45470 > log.example.com.514: [udp sum ok] SYSLOG, length: 426 Facility local6 (22), Severity notice (5) Msg: Mar 10 15:25:16 loadbalancer.example.com nginx_access: "[10/Mar/2017:15:25:16 +0100]" "NO-CACHE" "app.example.com:80" "0.032" "302" "331" "10.235.121.191" "sub.example.com" "GET /location/?parameter=value1 HTTP/1.1" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Win64; x64; Trident/7.0; .NET CLR 2.0.50727; SLCC2; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C; .NET4.0E; Tablet PC 2.0)"
我有时使用nginx的TAG字段来区分不同的日志文件:
access_log /var/log/nginx/www.example.com.ssl_access_log proxy; error_log /var/log/nginx/www.example.com.ssl_error_log warn; access_log syslog:server=10.0.80.110,facility=local6,tag=nginx_access,severity=notice proxy; error_log syslog:server=10.0.80.110,facility=local6,tag=nginx_error,severity=error warn;
然后在接收syslog-ng服务器上,我可以对传入的消息进行sorting,或者将它们转储到一个大文件中:
source s_net { udp(); }; filter f_prg_nginx_access{ program(nginx_access); }; filter f_prg_nginx_error{ program(nginx_error); }; destination d_lb_access { file("/var/log/lb_access.log" perm(0640));}; destination d_lb_error { file("/var/log/lb_error.log" perm(0640)); }; log { source(s_net); filter(f_prg_nginx_access); destination(d_lb_access); }; log { source(s_net); filter(f_prg_nginx_error); destination(d_lb_error); };
正如Robert Fekete已经提到的那样,Syslog-ng的标记过滤是内部标记消息到达特定端口或匹配模式的另一种方式。 另外[2]说,标记是在syslog-ng中sorting消息的最快方法,但标记只能在本地使用,不能通过networking发送。
[1] https://www.nginx.com/resources/admin-guide/logging-and-monitoring/ [2] https://www.balabit.com/sites/default/files/documents/syslog-ng- OSE-3.6-指南/ EN / syslog-ng的-OSE-V3.6引导pipe理员/ HTML /标签,messages.html