我正在就 syslog-NG 的问题与您联系。我们的一些设备(主要是 HP 交换机和 SAN)正在发送似乎不遵守 syslog RFC 5424 的 syslog 消息。
举几个例子:
如果我嗅探服务器的网络接口,我们可以看到这些“错误”消息(如您所见,在 PRI 之后,我们可以看到 PROGRAM,然后是时区和用逗号分隔的字段。简而言之,混合字段,缺少字段等不是标准的系统日志消息):
<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
因此,我目前无法过滤这些消息。我尝试定义一个常规过滤器并尝试打印 MSGHDR、MSG、PRI 等字段,但什么也看不到。
过滤此消息的唯一方法是仅定义外部接口和一个文件作为输出,而无需任何模板。
例如,如果我做这样的过滤器:
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")
);
};
但没有任何效果,没有显示任何内容。我尝试了所有字段,MSG、MESSAGE、MSGHDR 等。无法管理显示任何内容。唯一有效的是没有过滤器或模板的解析。
自然,如果我尝试了所有类型的过滤器,如下面的这些,它就不起作用(因为字段是混合的):
filter f_is_SAN {
host("cswc.*" flags(ignore-case));
};
相同的:
filter f_is_SAN {
match(".*cswc.*" flags(ignore-case));
};
关于如何为来自这些设备(主机名或程序名)的这些消息创建过滤器的任何提示?
感谢和问候,
实际上,syslog-ng 并没有重新格式化它们,而是添加了一个适当的 syslog 标头:
以下是 syslog 添加的:
其余的是原始消息:
因此 syslog-ng 同意您的观点,即这些消息不符合 RFC。
在设置过滤器方面,这意味着您没有太多可玩的了。
我个人更习惯于 rsyslog(您可以在其中使用正则表达式检查消息,例如寻找
raslogd
- 尽管这不一定有效)。但是,标题 syslog-ng 能够添加给您一些事情要做:
似乎 syslog-ng 能够报告一个主机名,我倾向于假设它是从源 IP 解析的。因此,您至少可以使用主机或网络掩码过滤源 IP :
filter hp_hosts { (host(192.168.0.25)) };
您当前的主机过滤器失败,因为消息中没有 HOST 字段 -
host
过滤器状态的文档:但是,您确实在消息中有一个主机名(至少在您的示例中),因此您可以考虑使用消息过滤器。
话虽如此 - 对我来说,如果有可能获得所有这些设备的源 IP 列表(我只能为了你的缘故希望这是可能的),那么我会使用网络掩码过滤器 - 它似乎很可能是比其他选项更有效。
嗯,我找到了一个似乎有效的解决方案
我正在重用“本地副本”目标作为源
例如:
我有一个常规的日志过滤器,保留所有内容的副本:
该消息保存在正在重新格式化的“本地副本”中。然后我可以从源中的这个文件重新读取并将过滤器应用到它。它很脏,但它有效: