Python logging über den syslogd (rsyslog)
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 | 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.