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/