local_log.py 2.0 KB

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