logger.py 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. # Copyright (c) Meta Platforms, Inc. and affiliates. All Rights Reserved
  2. # pyre-unsafe
  3. import logging
  4. import os
  5. LOG_LEVELS = {
  6. "DEBUG": logging.DEBUG,
  7. "INFO": logging.INFO,
  8. "WARNING": logging.WARNING,
  9. "ERROR": logging.ERROR,
  10. "CRITICAL": logging.CRITICAL,
  11. }
  12. class ColoredFormatter(logging.Formatter):
  13. """A command line formatter with different colors for each level."""
  14. def __init__(self):
  15. super().__init__()
  16. reset = "\033[0m"
  17. colors = {
  18. logging.DEBUG: f"{reset}\033[36m", # cyan,
  19. logging.INFO: f"{reset}\033[32m", # green
  20. logging.WARNING: f"{reset}\033[33m", # yellow
  21. logging.ERROR: f"{reset}\033[31m", # red
  22. logging.CRITICAL: f"{reset}\033[35m", # magenta
  23. }
  24. fmt_str = "{color}%(levelname)s %(asctime)s %(process)d %(filename)s:%(lineno)4d:{reset} %(message)s"
  25. self.formatters = {
  26. level: logging.Formatter(fmt_str.format(color=color, reset=reset))
  27. for level, color in colors.items()
  28. }
  29. self.default_formatter = self.formatters[logging.INFO]
  30. def format(self, record):
  31. formatter = self.formatters.get(record.levelno, self.default_formatter)
  32. return formatter.format(record)
  33. def get_logger(name, level=logging.INFO):
  34. """A command line logger."""
  35. if "LOG_LEVEL" in os.environ:
  36. level = os.environ["LOG_LEVEL"].upper()
  37. assert level in LOG_LEVELS, (
  38. f"Invalid LOG_LEVEL: {level}, must be one of {list(LOG_LEVELS.keys())}"
  39. )
  40. level = LOG_LEVELS[level]
  41. logger = logging.getLogger(name)
  42. logger.setLevel(level)
  43. logger.propagate = False
  44. ch = logging.StreamHandler()
  45. ch.setLevel(level)
  46. ch.setFormatter(ColoredFormatter())
  47. logger.addHandler(ch)
  48. return logger