logging_conf.py 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. """
  2. logging_conf.py - 统一日志配置
  3. 对应原 Shell 中 echo + tee 的组合效果。
  4. """
  5. import logging
  6. import sys
  7. from pathlib import Path
  8. from typing import Optional
  9. def setup_logging(
  10. level: int = logging.INFO,
  11. log_file: Optional[str] = None,
  12. console: bool = True,
  13. ) -> None:
  14. """
  15. 配置根日志记录器。
  16. Args:
  17. level: 日志级别,例如 logging.DEBUG / logging.INFO
  18. log_file: 文件路径,如果提供则同时写入该文件(相当于 tee 效果)
  19. console: 是否输出到控制台(sys.stdout)
  20. """
  21. root = logging.getLogger()
  22. root.setLevel(level)
  23. # 清除已有 handlers,避免重复
  24. root.handlers.clear()
  25. formatter = logging.Formatter(
  26. "%(asctime)s [%(levelname)-8s] %(name)s: %(message)s",
  27. datefmt="%Y-%m-%d %H:%M:%S",
  28. )
  29. if console:
  30. console_handler = logging.StreamHandler(sys.stdout)
  31. console_handler.setLevel(level)
  32. console_handler.setFormatter(formatter)
  33. root.addHandler(console_handler)
  34. if log_file:
  35. log_path = Path(log_file)
  36. log_path.parent.mkdir(parents=True, exist_ok=True)
  37. file_handler = logging.FileHandler(str(log_path), encoding="utf-8")
  38. file_handler.setLevel(level)
  39. file_handler.setFormatter(formatter)
  40. root.addHandler(file_handler)
  41. # 减少第三方库的日志噪音
  42. logging.getLogger("paramiko").setLevel(logging.WARNING)
  43. logging.getLogger("ftplib").setLevel(logging.WARNING)
  44. def get_logger(name: str) -> logging.Logger:
  45. """获取命名日志记录器,推荐使用 __name__ 作为参数"""
  46. return logging.getLogger(name)