如何在 rsyslog 中处理来自自定义应用程序的消息?

如何在 rsyslog 中处理来自自定义应用程序的消息?

我的服务器上有一个 Ruby 应用程序,我们将其称为“alpha”。该应用程序使用程序名称“alpha”发出系统日志消息。我想根据消息类型将日志消息分成单独的文件,例如“auth”消息(登录)或系统资源警告。

除了我的程序名称之外,我没有任何其他方法为 syslog 指定“消息类型”,因此我只是在消息开头添加“AUTH:”、“SYSTEM:”等。

使用 Google 和手册页,我得出了以下条件:

:programname,isequal,"alpha"           /var/log/alpha.log

这会将来自“alpha”应用程序的所有消息记录到正确的日志文件中。

:msg,startswith," AUTH:"                /var/log/alpha-auth.log

这会将所有以“AUTH:”开头的消息记录到正确的日志文件中。

现在显然,最后一个条件不仅适用于“alpha”,还适用于所有消息。我想将这些条件组合成一个条件,即“所有来自 alpha 且以 AUTH: ... 开头的消息”。是否可以像这样使用“and”组合过滤器?

“BSD 样式的块”似乎很完美,因为我可以为我的应用程序定义一个块,并且所有条件仅适用于来自该应用程序的消息。不幸的是,根据文档,该功能不再受支持(已弃用?),我不想依赖已弃用的功能。rsyslog v7+ 是否引入了此类块的替代方案?

使用基于表达式的过滤器,我设法获得了我想要的结果,但我觉得就像是在用火箭筒杀死一只苍蝇:

if $programname == "alpha" and $msg startswith " AUTH:" then \
    /var/log/alpha-auth.log

实现此目的的“正确”方法是什么(即最简单且最不容易出错的方法)?


我正在使用 Debian Jessie,目前指的是 rsyslog 8.4.2

答案1

首先,在 /etc/rsyslog.d 中创建一个配置文件,例如01-alpha.conf,使事情井然有序。这样,您的 01-alpha.conf 将比 50-default.conf 先被读取。50-default.conf 有一条规则,将所有内容记录在 /var/log/syslog 中,因此在此示例中,我们将在将消息写入 alpha 的日志后将其丢弃。

在 01-alpha.conf 中:

:programname, isequal, "alpha" {
  *.* /var/log/alpha.log
  :msg, startswith, "AUTH:" {
    *.* /var/log/alpha-auth.log
  }
  stop
}

只有当程序名称为 alpha 时,消息才会进入此过滤器,然后它将记录在 /var/log/alpha.log 中。如果是身份验证日志,则将其记录在 /var/log/alpha-auth.log 中。最后,丢弃该消息,这样它就不会被写入其他地方。

相关内容