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

Hub*_*bro 3 linux syslog rsyslog

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

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

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

:programname,isequal,"alpha"           /var/log/alpha.log
Run Code Online (Sandbox Code Playgroud)

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

:msg,startswith," AUTH:"                /var/log/alpha-auth.log
Run Code Online (Sandbox Code Playgroud)

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

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

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

使用基于表达式的过滤器,我已经成功地得到了我想要的结果,但我感觉我正在使用火箭筒杀死一只苍蝇:

if $programname == "alpha" and $msg startswith " AUTH:" then \
    /var/log/alpha-auth.log
Run Code Online (Sandbox Code Playgroud)

执行此操作的“正确”(即最简单且最不容易出错)方法是什么?


我使用的是 Debian Jessie,目前意味着 rsyslog 8.4.2

Lui*_*ger 6

首先,在 /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
}
Run Code Online (Sandbox Code Playgroud)

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