我在 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 history
,rsyslog
已从 更新4.6.2-12
到5.8.10-2
版本。
经过一番调试后,我发现该$syslogtag == 'dev:'
条件在新版本中不起作用rsyslog
。$syslogtag
现在会吃掉消息的一部分直到第一个空格并且包含dev:Hello
而不仅仅是dev:
。
您能否告诉我该如何处理它以及如何使 rsyslog 正确解析标签?(更改来自 django 应用程序的日志消息格式不是一个选项)
如果您需要任何其他信息,请告诉我。谢谢。
答案1
如果应用程序有不同的名称,您可以使用 $programname 过滤器。
如果没有,你可以使用if $msg contains 'rel: ' then ....
答案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-12
和5.8.10-2
rsyslog 版本。但是,我认为这不是一个干净的解决方案,看起来更像是黑客行为。此外,我不确定这是否适用于未来的 rsyslog 版本。
希望还有其他答案或者评论。