2016-06-29 2 views
0

Я регистрирую сообщения в syslog с Python's SysLogHandler. Проблема заключается в том, что startswith в сочетании с шаблоном, похоже, «съедает» начало строки в журнале.rsyslog шаблон «есть» первая часть сообщения

Rsyslogd - версия 8.4.2, Python 2.7.9 (такое же поведение на 2.7.11). По-видимому, это не происходит на rsyslogd 7.x с Python 2.7.4.

Пример:

#!/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. В источнике питона, отдельныйname от остальной части строки с пустым пространством: logging.Formatter('%(name)s: %(message)s', '%Y-%m-%d %H:%M:%S')

Я не уверен, почему это не было проблемой на 2.7.4, и если кто-либо найдет причина, пожалуйста, напишите комментарий ниже.

Смежные вопросы