我创建了一个系统日志服务器和客户端。我想在发送到服务器的所有日志中的源宏中设置客户端序列号,以便在服务器端我可以检索宏并可以根据客户端序列号创建日志文件。以下是我的重写规则:
rewrite set_host{
set("DEVICE_SERIAL_NO", value("SOURCE"));
};
日志{源(s_src);重写(set_host);目的地(d_net);};
在服务器端,我为日志文件编写了以下配置:
destination d_host-specific {
file("/var/log/testlogs/$SOURCE/$YEAR/$MONTH/$HOST-$YEAR-$MONTH-$DAY.log");
};
但是在服务器端,我将 $SOURCE 的值作为 s_net。似乎 SOURCE 宏在服务器端被覆盖。如何维持从客户端到服务器的宏并在服务器端使用它?
$SOURCE
是本地值,默认不转发到服务器。每个目的地都有一个在线格式,例如,network()
源/目的地使用 BSD (RFC 3164) 或 IETF (RFC 5424) 系统日志协议。这些协议的默认模板包含$PROGRAM
、$MSG
、$HOST
、$ISODATE
等,但$SOURCE
不是标准字段。您有多种选择:
您可以手动指定目的地
template()
,然后在服务器端解析消息。例如,这可以以 JSON 格式 ($(format-json)
和json-parser()
) 完成。您可以使用 RFC 5424 系统日志消息的结构化数据部分:
和目的地
syslog()
使用network(flags(syslog-protocol))
IETF syslog 协议转发消息。下的所有子键.SDATA
都将自动序列化到转发的消息中。syslog-ng >= v3.17 有一个专用的源/目标插件,它以特殊格式在 syslog-ng 实例(包含所有名称-值对)之间“整体”传输消息。源对象和目标对象都被称为
ewmm()
(企业范围的消息模型)。作为替代方案,您可以使用
$HOST
with (keep-hostname(yes)
在服务器端),它是消息头的一部分。