2016-06-29 35 views
0

我使用Python的SysLogHandler將消息記錄到syslog。問題是startswith與模板結合似乎「吃」記錄字符串的開始。rsyslog模板「吃」消息的第一部分

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 

通知丟失的 '這個' 在消息中。

相反,除去使用rsyslog現在配置文件的結果模板:

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

去除模板%msg:::sp-if-no-1st-sp%似乎並沒有幫助的。

回答

0

溶液似乎是:

  1. 使用$syslogtag startswith代替$msg startswith
  2. 在Python源,單獨name從字符串內其餘的空的空間:logging.Formatter('%(name)s: %(message)s', '%Y-%m-%d %H:%M:%S')

我不確定爲什麼這不是2.7.4的問題,如果有人發現理由請在下面發表評論。