rsyslog模板"吃"消息的第一部分

时间:2016-06-29 17:22:33

标签: python rsyslog

我使用Python SysLogHandler将消息记录到syslog中。问题是startswith与模板相结合似乎" eat"记录字符串的开头。

Rsyslogd是版本8.4.2,Python 2.7.9(2.7.11上的相同行为)。然而,在使用Python 2.7.4的rsyslogd 7.x上似乎没有发生这种情况。

示例:

#!/usr/bin/env python
import logging
from logging.handlers import SysLogHandler

my_fmt = logging.Formatter('%(name)s:%(message)s', '%Y-%m-%d %H:%M:%S')
foo_handler = SysLogHandler(address='/dev/log', facility=SysLogHandler.LOG_LOCAL5)
foo_handler.setLevel(logging.INFO)
foo_handler.setFormatter(my_fmt)

foo = logging.getLogger('foo')
foo.setLevel(logging.INFO)
foo.addHandler(foo_handler)
foo.propagate = False

foo.info("This is foo")

使用此rsyslog配置:

$template myt,"%TIMESTAMP:::date-rfc3339%%msg:::sp-if-no-1st-sp%%msg:::drop-last-lf%\n"

if $syslogfacility-text == "local5" then {
    if $msg startswith "foo" then {
        action(type="omfile" file="/var/log/foo.log" template="myt")
    } else {
        action(type="omfile" file="/var/log/bar.log" template="myt")
    }
    stop
}

产生以下内容:

=> /var/log/bar.log <==
2016-06-29T17:29:55.330941+01:00 is foo

注意缺少的&#39;这个&#39;在消息中。

相反,删除使用rsyslog配置文件中的模板会导致:

==> /var/log/bar.log <==
Jun 29 18:19:40 localhost foo:This is foo

从模板中删除%msg:::sp-if-no-1st-sp%似乎也无济于事。

1 个答案:

答案 0 :(得分:0)

解决方案似乎是:

  1. 使用$syslogtag startswith代替$msg startswith
  2. 在python源代码中, 将<{1}}与字符串的其余部分分隔开来<{1}},空格为空:name
  3. 我不确定为什么这不是2.7.4的问题,如果有人发现原因,请在下面发表评论。