我有一个鱿鱼代理将访问日志记录到文件中,syslog-ng 读取这些日志,并根据鱿鱼的操作设置严重性(信息或通知)并将其作为系统日志消息转发到 NetXMS 服务器。问题是 NetXMS 服务器收到如下消息:
1 2024-04-17T11:13:11+02:00 vvsrv-proxy1 1713345191.357 - - [meta sequenceId="5336"] 69 10.30.108.14 TCP_TUNNEL/200 3530 CONNECT api.github.com:443 - HIER_DIRECT/140.82.121.5 -
(空行不是格式错误。)我想将文件中的行按原样转发到 NetXMS,如下所示:
1713345191.357 69 10.30.108.14 TCP_TUNNEL/200 3530 CONNECT api.github.com:443 - HIER_DIRECT/140.82.121.5 -
当前 syslog-ng 配置(不包括默认部分):
source s_squid {
file ("/var/log/squid/access.log");
};
filter f_squid_denied {
message ("TCP_DENIED");
};
destination d_squid {
syslog ("10.0.0.254" transport("udp") port(514) template("${MSG}"));
};
log {
source (s_squid);
filter (f_squid_denied);
rewrite { set_severity("notice"); };
destination (d_squid);
};
log {
source (s_squid);
rewrite { set_severity("info"); };
destination (d_squid);
};
版本信息:
syslog-ng 4 (4.1.1)
Config version: 4.0
当我尝试自己解决这个问题时,我发现源中不正确的 syslog 标头可能会导致中继 syslog-ng 服务器添加它自己的标头,但在我的情况下,源是本地文件。我还尝试切换到旧的网络驱动程序 - 而不是系统日志 - 但它仍然是一样的。
当我使用 rsyslog 将系统日志转发到 NetXMS 时,它没有任何额外的数据,因此 NetXMS 会按其应有的方式解析和处理系统日志消息。
更新#1
在深入研究 NetXMS 源代码后,我从日期解析方法中发现它只能解析RFC 3164系统日志消息。在阅读有关使用旧协议的syslog-ng 文档后,我尝试了以下操作:
destination d_squid {
network ("10.0.0.254" transport(udp) port(514));
};
但它仍然使用新的RFC 5424格式。
更新#2
我正在使用service syslog-ng reload
这还不够,重新启动服务后它开始使用 BSD syslog 格式。经过一些调整后,我的目的地现在看起来像这样:
destination d_squid {
network ("10.0.0.254" transport(udp) port(514) flags(no-multi-line) template(": ${MSG}"));
};
我没有更改配置的任何其他部分,但现在所有日志条目都具有“通知”严重性,而不是包含TCP_DENIED
子字符串的条目。
正确的配置如下所示:
解决方案是使用模板来格式化整个消息(包括 RFC 3164 标头),但这需要两个“相同”的目的地,因此我必须添加
persist_name
两个目的地以使其唯一。更新:我必须创建两个过滤器,一个匹配的过滤器和一个不匹配的过滤器,
TCP_DENIED
因为之前的配置为拒绝的消息发送了重复的条目。这是一个更紧凑的版本,与我对上一个答案给出的评论一致。
笔记: