rsyslog 升级后日志记录不起作用

rsyslog 升级后日志记录不起作用

我在 Red Hat 服务器上的 apache 下有几个不同的 django 应用程序。这些应用程序使用系统日志处理程序用于将日志消息发送到本地rsyslog服务。为了将来自不同 Django 应用程序的日志消息传输到不同的文件,我们使用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 historyrsyslog已从 ​​更新4.6.2-125.8.10-2版本。

经过一番调试后,我发现该$syslogtag == 'dev:'条件在新版本中不起作用rsyslog$syslogtag现在会吃掉消息的一部分直到第一个空格并且包含dev:Hello而不仅仅是dev:

您能否告诉我该如何处理它以及如何使 rsyslog 正确解析标签?(更改来自 django 应用程序的日志消息格式不是一个选项)

如果您需要任何其他信息,请告诉我。谢谢。

答案1

如果应用程序有不同的名称,您可以使用 $programname 过滤器。

如果没有,你可以使用if $msg contains 'rel: ' then ....

我建议看看http://www.rsyslog.com/doc/rsyslog_conf_filter.html

答案2

我迁移已经有一段时间了,但我相信你应该使用

$syslogtag startswith 'rel: '

而不是 ==

答案3

感谢其他答案帮助使if条件发挥作用,但问题是它$msg不包含从应用程序发送的实际日志消息,因为$syslogtag“吃掉”了消息的一部分直到其中的第一个空格。

作为一种解决方法,我可以更改日志模板并将缺失的消息部分从%syslogtag%和连接起来%msg%

$template myFormat,"%syslogtag:F,58:2%%msg%\n"

%syslogtag%它取冒号后面的部分(58 个 ascii 码)并添加%msg%后面的部分。

幸运的是,这适用于4.6.2-125.8.10-2rsyslog 版本。但是,我认为这不是一个干净的解决方案,看起来更像是黑客行为。此外,我不确定这是否适用于未来的 rsyslog 版本。

希望还有其他答案或者评论。

相关内容