我在红帽服务器上的apache下有几个不同的django应用程序。 这些应用程序使用SysLogHandler将日志消息发送到本地rsyslog服务。 为了把日志消息从不同的django应用程序传递到不同的文件,我们使用syslogtag rsyslog tagging (基于syslogtag )。 以下是我们在/etc/rsyslog.conf :
... $template myFormat,"%msg%\n" if $syslogfacility-text == 'local2' and $syslogtag == 'dev:' then /var/log/ap/dev/ws.log;myFormat if $syslogfacility-text == 'local2' and $syslogtag == 'rel:' then /var/log/ap/rel/ws.log;myFormat ...
这样工作:如果日志消息是dev:Hello World! , Hello World! 写入/var/log/ap/dev/ws.log 。
一切都很好,直到昨天。 我们的系统从6.2升级到6.3。 根据yum history , 4.6.2-12从4.6.2-12更新为5.8.10-2版本。
debugging了一下之后,我发现$syslogtag == 'dev:'条件不适用于新的rsyslog版本。 $syslogtag现在吃一个消息的一部分,直到第一个空间,并包含dev:Hello而不是只是dev: $syslogtag
你能指点我该怎么做,如何使rsyslog正确parsing标签? (更改来自django应用程序的日志消息格式不是一个选项)
让我知道如果你需要任何额外的信息。 谢谢。
如果应用程序具有不同的名称,则可以使用$ programnamefilter。
如果没有,你可以使用, if $msg contains 'rel: ' then ....
我会build议看看http://www.rsyslog.com/doc/rsyslog_conf_filter.html
我迁移了一段时间,但我相信你应该使用
$syslogtag startswith 'rel: '
而不是==
感谢帮助使if条件工作的其他答案,但是问题在于$msg不包含从应用程序发送的实际日志消息,因为$syslogtag “消息”部分消息直到其中的第一个空间。
作为一种解决方法,我可以更改日志模板并将缺less的消息部分从%syslogtag%和%msg% :
$template myFormat,"%syslogtag:F,58:2%%msg%\n"
它取冒号后面的%syslogtag%部分(58 ascii码),并在后面添加%msg% 。
幸运的是,这适用于4.6.2-12和5.8.10-2版本。 但是,我不认为这是一个很好的和干净的解决scheme,看起来更像一个黑客。 另外,我不确定这将适用于未来的rsyslog版本。
希望会有其他答案或评论。