local_log.py 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. import sys
  2. from datetime import date
  3. from pathlib import Path
  4. from loguru._logger import Logger as LoguruLogger
  5. from loguru import logger as global_logger
  6. from config import settings
  7. from core.utils.trace_utils import get_current_trace_id
  8. class Local:
  9. """
  10. 本地日志记录器
  11. """
  12. _initialized = set() # 防止重复初始化相同 platform_mode
  13. @staticmethod
  14. def init_logger(platform: str,
  15. mode: str,
  16. log_level: str = settings.LOG_LEVEL,
  17. log_to_console: bool = False,
  18. rotation: str = "00:00",
  19. retention: str = "10 days") -> LoguruLogger:
  20. key = f"{platform}_{mode}"
  21. if key in Local._initialized:
  22. return global_logger # 已初始化,直接返回
  23. # 创建日志目录
  24. log_path = Path(f"{settings.LOG_DIR}/{platform}")
  25. log_path.mkdir(parents=True, exist_ok=True)
  26. # 动态日期
  27. current_date = date.today().strftime("%Y-%m-%d")
  28. log_filename = f"{platform}-{mode}-{current_date}.log"
  29. log_file_path = log_path / log_filename
  30. # 添加文件日志
  31. global_logger.add(
  32. str(log_file_path),
  33. level=log_level.upper(),
  34. rotation=rotation,
  35. retention=retention,
  36. encoding="utf-8",
  37. enqueue=True,
  38. backtrace=True,
  39. diagnose=True
  40. )
  41. if log_to_console:
  42. global_logger.add(
  43. sys.stdout,
  44. level=log_level.upper(),
  45. format="<green>{time:YYYY-MM-DD HH:mm:ss}</green> | "
  46. "<level>{level}</level> | "
  47. "<cyan>{extra[platform]}</cyan> | "
  48. "<cyan>{extra[mode]}</cyan> | "
  49. f"<magenta>trace_id={get_current_trace_id()}</magenta> | "
  50. "{message}"
  51. )
  52. # 绑定上下文便于日志区分来源
  53. logger_with_context = global_logger.bind(platform=platform, mode=mode)
  54. Local._initialized.add(key)
  55. return logger_with_context