Python: Create a Logger

(Last Updated On: )

This post is how-to create a logger.

First we need to import

  1. import sys
  2. import logging
  3. from datetime import datetime
  4. from pytz import timezone

Then we create a class for Formatter

  1. class CustomFormatter(logging.Formatter):
  2. grey = "\x1b[38;20m"
  3. reset = "\x1b[0m"
  4. format = "%(asctime)s - %(name)s - %(levelname)s - %(message)s (%(filename)s:)"
  5. FORMATS = {
  6. logging.DEBUG: '\x1b[38;5;23m' + format + reset,
  7. logging.INFO: grey + format + reset,
  8. logging.WARNING: '\x1b[38;5;56m' + format + reset,
  9. logging.ERROR: '\x1b[38;5;197m' + format + reset,
  10. logging.CRITICAL: '\x1b[38;5;1m' + format +reset
  11. }
  12.  
  13. def format(self, record):
  14. log_fmt = self.FORMATS.get(record.levelno)
  15. formatter = logging.Formatter(log_fmt)
  16. return formatter.format(record)

Then we create a function set our logger up.

  1. def set_logger(logging_level, name, log_dir, timezone):
  2. LOGGING_LEVELS = ['WARNING','INFO','DEBUG','ERROR']
  3. if logging_level not in LOGGING_LEVELS:
  4. logging_level = 'INFO'
  5.  
  6. level_lookup = {
  7. 'WARNING': logging.WARNING,
  8. 'INFO': logging.INFO,
  9. 'DEBUG': logging.DEBUG,
  10. 'ERROR': logging.ERROR,
  11. }
  12. logging.Formatter.converter = lambda *args: datetime.now(tz=timezone(timezone)).timetuple()
  13. logging.basicConfig(level=level_lookup[logging_level], format="[%(levelname)s] %(asctime)s - %(message)s:%(lineno)d")
  14. stream_handler = logging.StreamHandler(sys.stdout)
  15. stream_handler.setFormatter(CustomFormatter())
  16. logger = logging.getLogger(name)
  17. logger.addHandler(stream_handler)
  18. logger.setLevel(logging_level)
  19.  
  20. Path(log_dir).mkdir(parents=True, exist_ok=True)
  21.  
  22. now = datetime.now(tz=timezone(timezone))
  23. now = now.strftime("%H-%M-%S")
  24.  
  25. log_file = '%slog_%s.log' % (log_dir, now)
  26. file_handler = logging.FileHandler(log_file, mode='a')
  27. file_handler.setFormatter(logging.Formatter("[%(levelname)s] %(asctime)s - %(message)s:%(lineno)d"))
  28. logger.addHandler(file_handler)
  29.  
  30. return logger

References

https://alexandra-zaharia.github.io/posts/make-your-own-custom-color-formatter-with-python-logging/