#!/usr/bin/python3 import logging import logging.handlers import sys import traceback from config import Config class LevelTagFilter(logging.Filter): "Add leveltag" def filter(self, record): # Extract the first character of the level name record.leveltag = record.levelname[0] # We never actually filter messages out, just abuse filtering to add an # extra field to the LogRecord return True log = logging.getLogger(Config.LOG_NAME) log.setLevel(logging.DEBUG) # stderr stderr = logging.StreamHandler() stderr.setLevel(Config.LOG_LEVEL_STDERR) # syslog syslog = logging.handlers.SysLogHandler(address='/dev/log') syslog.setLevel(Config.LOG_LEVEL_SYSLOG) # Filter filter = LevelTagFilter() syslog.addFilter(filter) stderr.addFilter(filter) # create formatter and add it to the handlers stderr_fmt = logging.Formatter('%(leveltag)s: %(message)s') syslog_fmt = logging.Formatter('[%(name)s] %(leveltag)s: %(message)s') stderr.setFormatter(stderr_fmt) syslog.setFormatter(syslog_fmt) # add the handlers to the log log.addHandler(stderr) log.addHandler(syslog) def log_uncaught_exceptions(ex_cls, ex, tb): logging.critical(''.join(traceback.format_tb(tb))) logging.critical('{0}: {1}'.format(ex_cls, ex)) sys.excepthook = log_uncaught_exceptions def DEBUG(msg): log.debug(msg) def EXCEPTION(msg): log.exception(msg) def ERROR(msg): log.error(msg) def INFO(msg): log.info(msg) if __name__ == "__main__": DEBUG("hi debug") ERROR("hi error") INFO("hi info") EXCEPTION("hi exception") def f(): return g() def g(): return h() def h(): return i() def i(): 1 / 0 f()