我的服务器上有一个 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 中。最后,丢弃该消息,这样它就不会被写入其他地方。