2016-06-29 6 views
0

Ich protokolliere Nachrichten an Syslog mit Python SysLogHandler. Das Problem ist, dass startswith kombiniert mit einer Vorlage den Anfang der protokollierten Zeichenfolge zu "essen" scheint.Rsyslog Vorlage "Essen" den ersten Teil einer Nachricht

Rsyslogd ist Version 8.4.2, Python 2.7.9 (dasselbe Verhalten auf 2.7.11). Es scheint jedoch nicht auf rsyslogd 7.x mit Python 2.7.4 zu passieren.

Beispiel:

#!/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") 

Mit dieser rsyslog Konfiguration:

$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 
} 

Erzeugt die folgenden:

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

Beachten Sie die fehlenden 'Diese' in der Nachricht.

umgekehrt in rsyslog Konfigurationsdatei führt die Verwendung der Vorlage entfernt in:

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

%msg:::sp-if-no-1st-sp% aus der Vorlage entfernen scheint nicht zu helfen.

Antwort

0

Die Lösung scheint zu sein:

  1. Verwenden $syslogtag startswith anstelle von $msg startswith
  2. in der Python-Quelle, separate die name vom Rest der Zeichenkette mit einem leeren Raum: logging.Formatter('%(name)s: %(message)s', '%Y-%m-%d %H:%M:%S')

Ich bin mir nicht sicher, warum dies auf 2.7.4 kein Problem war und ob jemand das gefunden hat Grund bitte posten Sie einen Kommentar unten.