Python logging über den syslogd (rsyslog)

 · 3 min read
 · Stefan Hellmann
Last updated: June 03, 2019

In diversen Programmen logge ich gerne unter Umständern sehr viele Daten mit. Gerade für die Fehlersuche finde ich das sehr hilfreich. Nach verschiedenen Test ist das hier für mich bisher die beste Lösung.

Über das Python logging Module baue ich mir in jedem Programm mit folgender Funktion schnell einen Logger. Rufe ich das Programm dann mit dem Parameter -d auf, wird das Logging direkt auf das debug Level gestellt. Hier exemplarisch unter der Version 3.3:

import argparse
import logging
import logging.handlers


def create_logger():
    # parse commandline arguments
    parser = argparse.ArgumentParser()
    # define arguments
    parser.add_argument("-d", "--debug", help="Run in debug mode.", action="store_true")
    # get args
    args = parser.parse_args()

    # define logger
    my_logger = logging.getLogger('logger')

    # define log level based on commandline arguments
    if args.debug:
    my_logger.setLevel(logging.DEBUG)
    else:
    my_logger.setLevel(logging.INFO)

    # create logging handler
    handler = logging.handlers.SysLogHandler(address='/dev/log', facility=20)

    # define log format
    formatter = logging.Formatter('image_creator [%(process)s]: %(message)s')
    handler.setFormatter(formatter)

    # add handler to logger
    my_logger.addHandler(handler)
    return my_logger

logger = create_logger()
logger.info('info')
logger.warn('warn')
logger.debug('debug')
logger.error('error')

Um in Zeile 24 die facilitiy zu definieren, ist diese Tabelle sehr hilfreich:

Num Code Facility
0 kern kernel messages
1 user user-level messages
2 mail kernel messages
3 daemon system daemons
4 auth security/authorization messages
5 syslog messages generated internally by syslogd
6 lpr line printer subsystem
7 news network news subsystem
8 uucp UUCP subsystem
9 cron clock daemon
10 security security/authorization messages
11 ftp FTP daemon
12 ntp NTP subsystem
13 logaudit log audit
14 logalert log aler
15 clock clock daemon
16 local0 local use 0(local0)
17 local1 local use 1(local1)
18 local2 local use 2(local2)
19 local3 local use 3(local3)
20 local4 local use 4(local4)
21 local5 local use 5(local5)
21 local6 local use 6(local6)
22 local7 local use 7(local7)

Wer dann noch alles in ein extra Log schreiben möchte, kann dies über folgende Änderung in der Datei /etc/rsyslog.conf tun:

local4.*        /var/log/pylogging.log
&~

Die im Script genutzt facility sollte dann natürlich zu der in der rsyslog.conf passen. Die letzten zwei Zeichen &~ sorgen dafür, dass keine weiter Konfiguration ausgewertet wird. D.h. es wird nur in die entsprechende Datei geschrieben.

Dadurch, dass der Systemlogger genutzt wird, muss man sich keine Gedanken mehr über große Logsfiles, Archivierung etc. machen. Diese übernimmt alles der Systemlogger.