我正在从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) ,并使用parser { syslog-parser(); };将syslogparsing器添加回pipe道parser { syslog-parser(); }; 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)parsingflags(no-parse) ,然后将其添加回parser { syslog-parser(); }; parser { syslog-parser(); }; , 一切都很好。 发往港口5514或6514的1,2017/08/14缺less领先的1,2017/08/14 。
看起来syslogparsing器的parsing是基于它是隐式还是明确地放入pipe道。
有没有办法获得所需的行为,而不必使用flags(no-parse)并明确地添加parsing器回来?
在我看来,这条消息不符合系统日志RFC,程序字段丢失,我会说这是根本原因。 如果发生这种情况,syslog-ng将使用一些启发式方法来尝试parsing消息。 您的消息中缺less的1,2017 / 08/14部分可能被parsing到$ PROGRAM字段中。 作为解决方法,请检查使用以下模板是否解决了问题:template(“$ PROGRAM $ MSG \ n”))
或者,如果上述操作不起作用,则检查是否可以使用筛选器分隔有问题的邮件(例如,基于发件人主机),并且可以使用交汇点仅在这些邮件上使用无分析标记。 您可以在文档中find类似案例的示例: https : //www.balabit.com/documents/syslog-ng-ose-latest-guides/en/syslog-ng-ose-guide-admin/html/junctions html的
然而,奇怪的是,parsing器在明确和隐式使用时行为不同,AFAIK在两种情况下运行相同的代码。 请在syslog-ng github页面上打开一个关于它的问题
问候,罗伯特