logger_config.py 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. """
  2. 统一的日志配置工具
  3. 用于在整个项目中统一管理日志配置,避免重复日志输出
  4. """
  5. import logging
  6. from typing import Optional
  7. def setup_logger(
  8. name: str,
  9. level: int = logging.INFO,
  10. propagate: bool = False,
  11. formatter_string: Optional[str] = None
  12. ) -> logging.Logger:
  13. """
  14. 设置并配置logger,避免重复日志输出
  15. @param name: logger名称,通常使用 __name__
  16. @param level: 日志级别,默认为 INFO
  17. @param propagate: 是否向父级logger传播,默认为False,避免重复输出
  18. @param formatter_string: 自定义格式字符串,如果不提供则使用默认格式
  19. @return: 配置好的logger对象
  20. """
  21. logger = logging.getLogger(name)
  22. # 避免重复添加处理器导致重复日志
  23. if not logger.handlers:
  24. logger.setLevel(level)
  25. # 创建控制台处理器
  26. handler = logging.StreamHandler()
  27. # 设置日志格式
  28. if formatter_string is None:
  29. formatter_string = '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
  30. formatter = logging.Formatter(formatter_string)
  31. handler.setFormatter(formatter)
  32. # 添加处理器
  33. logger.addHandler(handler)
  34. # 控制日志传播
  35. logger.propagate = propagate
  36. return logger
  37. def get_api_logger(module_name: str) -> logging.Logger:
  38. """
  39. 为API模块获取标准logger配置
  40. @param module_name: 模块名称,通常使用 __name__
  41. @return: 配置好的logger对象
  42. """
  43. return setup_logger(
  44. name=module_name,
  45. level=logging.INFO,
  46. propagate=False # API层不传播到父级,避免与uvicorn日志冲突
  47. )
  48. def get_service_logger(module_name: str) -> logging.Logger:
  49. """
  50. 为Service模块获取标准logger配置
  51. @param module_name: 模块名称,通常使用 __name__
  52. @return: 配置好的logger对象
  53. """
  54. return setup_logger(
  55. name=module_name,
  56. level=logging.INFO,
  57. propagate=False # Service层不传播到父级,保持独立
  58. )
  59. def get_utils_logger(module_name: str) -> logging.Logger:
  60. """
  61. 为工具模块获取标准logger配置
  62. @param module_name: 模块名称,通常使用 __name__
  63. @return: 配置好的logger对象
  64. """
  65. return setup_logger(
  66. name=module_name,
  67. level=logging.INFO,
  68. propagate=False # 工具层不传播到父级,保持独立
  69. )
  70. # 主应用日志配置函数
  71. def configure_root_logging(level: int = logging.INFO) -> None:
  72. """
  73. 配置根日志系统,只在应用启动时调用一次
  74. @param level: 根日志级别
  75. """
  76. # 检查是否已经配置过,避免重复配置
  77. if not logging.getLogger().handlers:
  78. logging.basicConfig(
  79. level=level,
  80. format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
  81. )