logging.py 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. import logging
  2. import os
  3. loglevel = os.getenv("LOGLEVEL", "INFO")
  4. class CustomFormatter(logging.Formatter):
  5. """
  6. A formatter that allows a log time and caller info to be overridden via
  7. ``logger.log(level, message, extra={"origin_created": ..., "caller": ...})``.
  8. """
  9. def format(self, record: logging.LogRecord) -> str:
  10. if hasattr(record, "origin_created"):
  11. record.created = record.origin_created
  12. record.msecs = (record.created - int(record.created)) * 1000
  13. if not hasattr(record, "caller"):
  14. record.caller = f"{record.name}.{record.funcName}:{record.lineno}"
  15. return super().format(record)
  16. def get_logger(module_name: str) -> logging.Logger:
  17. # trim package name
  18. name_without_prefix = ".".join(module_name.split(".")[1:])
  19. logging.addLevelName(logging.WARNING, "WARN")
  20. formatter = CustomFormatter(
  21. fmt="[{asctime}.{msecs:03.0f}][{levelname}][{caller}] {message}",
  22. style="{",
  23. datefmt="%Y/%m/%d %H:%M:%S",
  24. )
  25. handler = logging.StreamHandler()
  26. handler.setFormatter(formatter)
  27. logger = logging.getLogger(name_without_prefix)
  28. logger.setLevel(loglevel)
  29. logger.addHandler(handler)
  30. logger.propagate = False
  31. return logger
  32. def golog_level_to_python(level: str) -> int:
  33. level = level.upper()
  34. if level in ["DPANIC", "PANIC", "FATAL"]:
  35. return logging.CRITICAL
  36. level = logging.getLevelName(level)
  37. if not isinstance(level, int):
  38. raise ValueError(f"Unknown go-log level: {level}")
  39. return level
  40. def python_level_to_golog(level: str) -> str:
  41. if not isinstance(level, str):
  42. raise ValueError("`level` is expected to be a Python log level in the string form")
  43. if level == "CRITICAL":
  44. return "FATAL"
  45. if level == "WARNING":
  46. return "WARN"
  47. return level