我正在与您联系,关于我在syslog-NG上遇到的问题。 我们的一些设备(主要是HP交换机和SAN)正在发送不遵守系统日志RFC 5424的系统日志消息。
给你几个例子:
如果我嗅探服务器的networking接口,我们可以看到这样的“错误的”消息(正如你所看到的,在PRI之后,我们可以看到PROGRAM,然后时区和字段用逗号隔开,简而言之,混合字段,缺less字段等不是标准的系统日志消息):
<190>raslogd: 2017/03/08-16:03:20, [SEC-1203], 53642, WWN 10:00:50:eb:1a:6c:21:38 | FID 128, INFO, cswc-mo8x-SAN01, Login information: Login successful via TELNET/SSH/RSH. IP Addr: 1.2.3.4
因此,我目前无法过滤这些消息。 我试图定义一个常规的filter,并尝试打印字段,如MSGHDR,MSG,PRI等,但看不到任何东西。
只有通过定义外部接口和文件作为输出,没有任何模板,过滤这个消息的唯一方法。
例如,如果我做这样的filter:
destination d_INCOMING_ALL { file("/app/syslog-ng/logs/incoming_all.log"); }; log { source(s_EXTERNAL); destination(d_INCOMING_ALL); };
我可以在日志文件中看到消息,但以某种方式格式化(我想syslog-NG将它们重新格式化):
[root@xxxxxxxxxxxx logs]# grep -i cswc incoming_all.log Mar 9 09:44:20 cswc-mo8x-hpsan01 raslogd: 2017/03/09-08:34:50, [SEC-1203], 53647, WWN 10:00:50:eb:1a:6c:21:38 | FID 128, INFO, cswc-mo8x-SAN01, Login information: Login successful via TELNET/SSH/RSH. IP Addr: 1.2.3.4 [root@xm1p1034vmo logs]#
问题是我不能过滤这些消息(我们接收来自1000多个设备的日志),我需要过滤来自这些设备的消息! 唯一的办法是我可以做到这一点主机名(cswc- )或程序名(raslogd )
所以我试图通过向该文件添加模板来显示字段,例如:
destination d_test { file ("/app/syslog-ng/logs/test_olivier.log" template("pri=${priority} date=${ISODATE} host=${HOST} program=${PROGRAM} message=${MSG}\n") ); };
但没有任何工作,什么都不显示。 我试过所有的领域,味精,MESSAGE,MSGHDR等。不能pipe理显示任何东西。 唯一的工作是parsing没有filter或模板。
自然,如果我把所有types的filter,如下所示,它不起作用(如字段混合):
filter f_is_SAN { host("cswc.*" flags(ignore-case)); };
同样的:
filter f_is_SAN { match(".*cswc.*" flags(ignore-case)); };
有关如何为这些来自这些设备(主机名或程序名)的消息创buildfilter的提示?
感谢和问候,
实际上,syslog-ng并没有重新格式化,而是添加了一个合适的syslog头文件:
Mar 9 09:44:20 cswc-mo8x-hpsan01 raslogd:2017/03 / 09-08:34:50,[SEC-1203],53647,WWN 10:00:50:eb:1a:6c:21:38 | FID 128,INFO,cswc-mo8x-SAN01,login信息:通过TELNET / SSH / RSHlogin成功。 IP地址:1.2.3.4
以下是syslog添加的内容:
3月9日09:44:20 cswc-mo8x-hpsan01
其余的是原来的消息:
raslogd:2017/03 / 09-08:34:50,[SEC-1203],53647,WWN 10:00:50:eb:1a:6c:21:38 | FID 128,INFO,cswc-mo8x-SAN01,login信息:通过TELNET / SSH / RSHlogin成功。 IP地址:1.2.3.4
所以syslog-ng同意你这些消息不符合RFC标准。
在设置filter方面,这意味着你没有太多的玩法。
我个人更习惯于rsyslog(你可以用正则expression式来检查消息,例如寻找raslogd – 虽然这不一定有效)。
但是,syslog-ng头文件可以添加给你几件事:
看来syslog-ng能够报告一个主机名,我倾向于假设它是从源IPparsing的。 所以你至less可以在源IP上使用主机或networking掩码进行过滤:
filter hp_hosts { (host(192.168.0.25)) };
您的当前主机filter失败,因为消息中没有HOST字段 – hostfilter状态的文档:
也就是说,syslog-ng OSE会将filterexpression式与$ {HOST}macros的内容进行比较。
你在邮件中有一个主机名(至less在你的例子中),所以你可以考虑使用一个消息filter。
这就是说 – 对我来说,如果有可能得到所有这些设备的源IP列表(我只能希望你的缘故,那么我可以),那么我会使用networking掩码filter – 它似乎是比其他select更有效率。
mmh我find了一个似乎正在工作的解决scheme
我正在重复使用“本地副本”目标作为源
例如:
我有一个常规的日志filter保持一切的副本:
destination d_INCOMING_ALL { file("/app/syslog-ng/logs/incoming_all.log"); }; log { source(s_EXTERNAL); destination(d_INCOMING_ALL); };
该消息被保存在被重新格式化的“本地副本”中。 然后,我可以从源文件中重新读取这些文件,并将filter应用到它。 它很脏,但它的工作原理:
source s_NON_RFC_COMPLIANT { # new source file("/app/syslog-ng/logs/incoming_all.log" follow-freq(10)); }; .... destination d_INCOMING_ALL { file("/app/syslog-ng/logs/incoming_all.log"); # old destination where we keep a local copy of EVERYTHING }; .... log { # local copy of everything source(s_EXTERNAL); destination(d_INCOMING_ALL); }; .... other filters here .... filter f_is_Network { host("cswc.*" flags(ignore-case)) # we want to filter on hosts called cswc-something or program raslogd or program("raslogd" flags(ignore-case)); }; log { # new source for HP stuff here source(s_NON_RFC_COMPLIANT); filter(f_is_Network); # add the filters you need destination(<your_final_destination_here>); flags(final); };