我的服务器上有一个Ruby应用程序,我们称之为“alpha”。 应用程序发出系统日志消息,程序名称为“alpha”。 我想根据它是什么types的消息将我的日志消息分成单独的文件,例如“auth”消息(login)或系统资源警告。
我没有任何方式指定“消息types”syslog除了我的程序名称,所以我只是在我的消息开始时添加“AUTH:”,“SYSTEM:”等。
使用谷歌和手册页,我已经提出了这些条件:
:programname,isequal,"alpha" /var/log/alpha.log
这将所有来自“alpha”应用程序的消息logging到正确的日志文件中。
:msg,startswith," AUTH:" /var/log/alpha-auth.log
这将以“AUTH:”开头的所有消息logging到正确的日志文件中。
显然,最后一个条件不仅适用于“alpha”,而且适用于所有的消息。 我想将这些条件结合到一个表示“从AUTH开始的所有来自alpha的消息:…”。 是否有可能将滤波器与“和”结合起来?
“BSD风格块”似乎是完美的,因为我可以为我的应用程序定义一个块,所有条件只适用于来自该应用程序的消息。 不幸的是, 根据文档,该function不再支持 (不build议使用?),我不想依赖于不推荐使用的function。 rsyslog v7 +引入了这种块的替代scheme吗?
使用基于expression式的filter,我已经设法得到我想要的结果,但我觉得我正在用一个火箭筒杀死一只苍蝇:
if $programname == "alpha" and $msg startswith " AUTH:" then \ /var/log/alpha-auth.log
什么是“正确”(即最简单,最不容易出错)的方式来做到这一点?
我正在使用Debian Jessie,目前的意思是rsyslog 8.4.2
首先,在/etc/rsyslog.d中创build一个configuration文件,例如01-alpha.conf ,以使事情组织起来。 这样,您的01-alpha.conf将首先被读取为50-default.conf。 50-default.conf有一个规则来logging/ var / log / syslog中的所有内容,所以在这个例子中,我们将在alpha日志中写入消息后放弃这个消息。
在01-alpha.conf中:
:programname, isequal, "alpha" { *.* /var/log/alpha.log :msg, startswith, "AUTH:" { *.* /var/log/alpha-auth.log } stop }
如果程序名称是alpha,那么只会在此filter中input消息,然后它将login到/var/log/alpha.log。 如果是auth日志,则将其logging在/var/log/alpha-auth.log中。 最后,丢弃这个消息,这样它就不会被写在其他地方了。