在使用 syslog-ng 通过网络发送日志之前设置宏

在使用 syslog-ng 通过网络发送日志之前设置宏

我已经创建了一个 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

您有多种选择:

  1. 您可以手动指定目的地template(),然后在服务器端解析消息。例如,可以采用 JSON 格式($(format-json)json-parser())。

  2. 您可以使用 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将自动序列化到转发的消息中。

  1. syslog-ng >= v3.17 有一个专用的源/目标插件,它以特殊格式在 syslog-ng 实例之间“完整”传输消息(包含所有名称-值对)。源对象和目标对象都被称为ewmm()企业范围消息模型)。

  2. 另外,您可以在服务器端使用$HOSTwith ,它是消息头的一部分。keep-hostname(yes)

相关内容