rsyslog升级后日志logging不起作用

我在红帽服务器上的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 history4.6.2-124.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-125.8.10-2版本。 但是,我不认为这是一个很好的和干净的解决scheme,看起来更像一个黑客。 另外,我不确定这将适用于未来的rsyslog版本。

希望会有其他答案或评论。