This post is how-to create a logger.
First we need to import
import sys import logging from datetime import datetime from pytz import timezone
Then we create a class for Formatter
class CustomFormatter(logging.Formatter): grey = "\x1b[38;20m" reset = "\x1b[0m" format = "%(asctime)s - %(name)s - %(levelname)s - %(message)s (%(filename)s:)" FORMATS = { logging.DEBUG: '\x1b[38;5;23m' + format + reset, logging.INFO: grey + format + reset, logging.WARNING: '\x1b[38;5;56m' + format + reset, logging.ERROR: '\x1b[38;5;197m' + format + reset, logging.CRITICAL: '\x1b[38;5;1m' + format +reset } def format(self, record): log_fmt = self.FORMATS.get(record.levelno) formatter = logging.Formatter(log_fmt) return formatter.format(record)
Then we create a function set our logger up.
def set_logger(logging_level, name, log_dir, timezone): LOGGING_LEVELS = ['WARNING','INFO','DEBUG','ERROR'] if logging_level not in LOGGING_LEVELS: logging_level = 'INFO' level_lookup = { 'WARNING': logging.WARNING, 'INFO': logging.INFO, 'DEBUG': logging.DEBUG, 'ERROR': logging.ERROR, } logging.Formatter.converter = lambda *args: datetime.now(tz=timezone(timezone)).timetuple() logging.basicConfig(level=level_lookup[logging_level], format="[%(levelname)s] %(asctime)s - %(message)s:%(lineno)d") stream_handler = logging.StreamHandler(sys.stdout) stream_handler.setFormatter(CustomFormatter()) logger = logging.getLogger(name) logger.addHandler(stream_handler) logger.setLevel(logging_level) Path(log_dir).mkdir(parents=True, exist_ok=True) now = datetime.now(tz=timezone(timezone)) now = now.strftime("%H-%M-%S") log_file = '%slog_%s.log' % (log_dir, now) file_handler = logging.FileHandler(log_file, mode='a') file_handler.setFormatter(logging.Formatter("[%(levelname)s] %(asctime)s - %(message)s:%(lineno)d")) logger.addHandler(file_handler) return logger
References
https://alexandra-zaharia.github.io/posts/make-your-own-custom-color-formatter-with-python-logging/