如何使用较新的 template() 语法在 Rsyslog 的每一行前面添加发件人 IP?

如何使用较新的 template() 语法在 Rsyslog 的每一行前面添加发件人 IP?

我已经在我们公司运行 rsyslog 服务器大约十年了。当我们得到一个想要集中记录的新设备时,我们会将其指向 rsyslog 服务器的 IP 地址,然后它就会记录下来。

每个日志行始终都有一个时间戳,后跟发送主机的 IP 地址(或有时是主机名),直到本周我还只是认为 rsyslog 服务器会自动将其添加到日志中(可能在其上执行 rdns)。

但本周我们获得了一个可发送系统日志消息的新网络设备,而 rsyslog 记录的日志行没有源 IP 或任何其他方式来区分发送者是谁,这是我们以前从未遇到过的。

因此,我明白我实际上可以使用模板要求 rsyslog 服务器记录发送方 IP(对于已经在消息中包含自己的 IP 的发送方,这会产生一些冗余,但我对此没有意见)。但是有关如何使用模板的文档很复杂且难以理解,而且 rsyslog 文档推荐了一种较新的 template() 语法,但我在网上找不到很多示例,因为似乎每个人都仍在使用 $template。

我甚至尝试过向 GPT-4 询问一个例子,但它似乎也不太熟悉新语法,即使使用旧语法,它也会在模板中添加各种我从未要求过的复杂性,这严重混淆了我正在看的语法的正确理解。

一些额外的背景信息:我没有使用任何其他复杂性,如转发器或其他软件来解析日志(除了我自己编写的少数脚本不会因计划中的语法更改而受到阻碍),我只是希望能够 grep /var/log/syslog 以获取发送方 IP,从而查看它发送的内容。:)

答案1

好吧,经过一周的时间,每当我尝试阅读这些文档时,我的大脑就会出现故障,于是我找到了一位同事来帮助我阅读它们,然后我们想出了这个办法。

将所有内容保存到 /var/log/syslog 的行首先如下所示:

*.*;auth,authpriv.none          -/var/log/syslog

因此我们创建了以下模板:

template(name="includeLocalTimestampAndSourceIP" type="list") {
    constant(value="[")
    property(name="timegenerated" dateFormat="mysql")
    constant(value=" ")
    property(name="fromhost-ip")
    constant(value="]")
    constant(value=" ")
    constant(value="(")
    property(name="timereported" dateFormat="rfc3164")
    constant(value=" ")
    property(name="hostname")
    constant(value=")")
    constant(value=" ")
    property(name="syslogtag")
    constant(value=":")
    property(name="msg")
    constant(value="\n")
}

并通过附加分号和上述模板名称修改了保存到 /var/log/syslog 的行:

*.*;auth,authpriv.none          -/var/log/syslog;includeLocalTimestampAndSourceIP

属性timegenerated始终是接收数据包时 rsyslog 守护进程时钟上的时间,并将其格式设置为mysql提供一个相对明确但紧凑的时间戳,看起来像20240227124659。年、月、日、时、分、秒,假定为 rsyslog 服务器感知的本地时间。

fromhost-ip是发送消息的 IP 地址,同样由 Rsyslog 守护进程感知。因此,即使主机发送了带有无意义主机名的消息(例如,截至本文撰写时,所有 cnMatrix 交换机都发送“ISS”作为主机名,或 Linksys SIP ATA 发送检查笔记SIP 消息类型为主机名?!)这澄清了谁发送了此行。将来的某个时候,我可能会让 Rsyslog 将来自不同主机的消息保存到不同的文件中,但现在我想坚持我所知道的在我们的工作流程中有效的方式。

timereported是主机发送的消息中的时间。有时它会偏离一个小时,这意味着我们可能需要修复主机的 DST 设置,或者主机根本无法处理 DST。有时它会偏离 8 小时,这意味着主机正在发送 UTC。

但最重要的是,如果主机重新启动并在获取 NTP 更新之前开始发送消息,则报告的时间将毫无意义(通常是 1968 年 12 月 31 日作为我们时区的 unix 时间戳记,有时是其他任意日期),无法澄清哪些行是在特定重新启动之前或之后,我们可能需要进行故障排除。

将其格式设置为会rfc3164创建看起来像的日期Feb 27 12:46:59,一方面这可以满足我们这些想要大致了解日志条目生成时间但又不想解压简洁的 mysql 格式的员工的需求,另一方面可以快速向我说明哪个时间戳更值得信赖,哪个时间戳更不正式,因此很可能出错。

hostname是主机想要的名称。对于我们 95% 的设备来说,它与 Rsyslog 的相同fromhost-ip,但有时主机使用更友好的名称,有时此字段中的错误可能具有诊断意义。有时它只是垃圾哈哈!

syslogtag是主机定义的一个有用的额外字段,我编写的脚本经常使用它来识别哪个脚本正在报告某些内容。

最后,msg属性是日志行的主要有效负载。

相关内容