如何在syslog-ng中的标签上进行过滤,当它们在处理过程中似乎不可用时?

我很难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它。

在没有看到示例消息的情况下,我可以为此问题提出以下可能的解决方法:

  1. 如果消息的PROGRAM字段已设置,则可以对该字段进行过滤,而不是标签。
  2. 你提到标签出现在MSGHDRmacros中。 你也可以使用match()filter来过滤,如下所示:filter demo_filter {match(“nginx”value(“MSGHDR”))};
  3. 将nginx消息发送到日志服务器的单独端口,并在日志服务器上将源configuration为仅在此端口上接收消息。 syslog-ng将自动为从源代码接收的每条消息添加一个标记(请参阅http://www.balabit.com/sites/default/files/documents/syslog-ng-ose-3.6-guides/en/syslog-ng -v3.6-guide-admin / html / tagging-messages.html )

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