我正在将大型 syslog 场从 syslog-ng 2.0.9 迁移到 3.8.1。
我有如下传入数据报:
<14>Aug 14 21:28:49 pa01.foo.com 1,2017/08/14 21:28:49,009401031978,THREAT,url,...
实际消息在 pa01.foo.com 主机名之后立即开始。
在 2.0.9 中,我仅使用“$MSG”作为输出模板,输出文件将获得:
1,2017/08/14 21:28:49,009401031978,THREAT,url,...
这正是我想要的。
在 3.8.1 上,它决定实际消息开始的位置不同,我的输出如下所示:
21:28:49,009401031978,THREAT,url,...
我失去了领先1,2017/08/14
。
flags(no-parse)
我发现在源头设置并将 syslog 解析器重新添加到管道中可以parser { syslog-parser(); };
正常工作。总结:
source net_src1 { network( transport("udp") port(4514) flags(no-parse)); };
source net_src2 { network( transport("udp") port(5514)); };
source net_src3 { syslog( transport("udp") port(6514)); };
filter f_test { netmask(127.0.0.1/32); } ;
destination d_test1 { file("/data/syslog/test/1" template("$MSG\n")); };
log { source(net_src1); filter(f_test); parser { syslog-parser(); }; destination(d_test1); flags(final); };
destination d_test2 { file("/data/syslog/test/2" template("$MSG\n")); };
log { source(net_src2); filter(f_test); destination(d_test2); flags(final); };
destination d_test3 { file("/data/syslog/test/3" template("$MSG\n")); };
log { source(net_src3); filter(f_test); destination(d_test3); flags(final); };
如果我发送到禁用解析的端口 4514 flags(no-parse)
,然后使用 将其重新添加parser { syslog-parser(); };
,则一切正常。发送到端口 5514 或 6514 的流量缺少前导1,2017/08/14
。
看来 syslog-parser 的解析方式根据它是隐式还是显式放入管道而不同。
有没有办法获得所需的行为而不必使用flags(no-parse)
并明确添加解析器?
答案1
在我看来,该消息不符合 syslog RFC,并且缺少程序字段,我认为这是根本原因。如果发生这种情况,syslog-ng 会使用一些启发式方法来尝试解析该消息。消息中缺少的 1,2017/08/14 部分可能被解析到 $PROGRAM 字段中。作为一种解决方法,请检查使用以下模板是否能解决问题:template("$PROGRAM $MSG\n"))
或者,如果上述方法不起作用,请检查是否可以使用过滤器来分离有问题的消息(例如,基于发送方主机),并且可以使用连接仅对这些消息使用 no-parse 标志。您可以在文档中找到类似案例的示例:https://www.balabit.com/documents/syslog-ng-ose-latest-guides/en/syslog-ng-ose-guide-admin/html/junctions.html
尽管如此,奇怪的是,解析器在显式和隐式使用时的行为不同,据我所知,在两种情况下运行的是相同的代码。请在syslog-ng github 页面
问候,罗伯特