#!/usr/bin/python3 import colorlog import logging import logging.handlers import os import stackprinter # type: ignore import sys from traceback import print_exception from config import Config class LevelTagFilter(logging.Filter): """Add leveltag""" def filter(self, record: logging.LogRecord): # 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) local_filter = LevelTagFilter() # stderr stderr = colorlog.StreamHandler() stderr.setLevel(Config.LOG_LEVEL_STDERR) stderr.addFilter(local_filter) stderr_fmt = colorlog.ColoredFormatter( "%(log_color)s[%(asctime)s] %(filename)s:%(lineno)s %(message)s", datefmt="%H:%M:%S" ) stderr.setFormatter(stderr_fmt) log.addHandler(stderr) # syslog syslog = logging.handlers.SysLogHandler(address="/dev/log") syslog.setLevel(Config.LOG_LEVEL_SYSLOG) syslog.addFilter(local_filter) syslog_fmt = logging.Formatter( "[%(name)s] %(filename)s:%(lineno)s %(leveltag)s: %(message)s" ) syslog.setFormatter(syslog_fmt) log.addHandler(syslog) def log_uncaught_exceptions(type_, value, traceback): from helpers import send_mail print("\033[1;31;47m") print_exception(type_, value, traceback) print("\033[1;37;40m") print( stackprinter.format( value, suppressed_paths=["/pypoetry/virtualenvs/"], style="darkbg" ) ) if os.environ["MM_ENV"] == "PRODUCTION": msg = stackprinter.format(value) send_mail( Config.ERRORS_TO, Config.ERRORS_FROM, "Exception from musicmuster", msg ) sys.excepthook = log_uncaught_exceptions