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