logger.py 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. # mt_spider/logger.py
  2. import os
  3. import logging
  4. from datetime import datetime
  5. from pathlib import Path
  6. from logging.handlers import TimedRotatingFileHandler
  7. LOG_DIR = os.path.join(os.path.dirname(__file__), '..', 'logs')
  8. os.makedirs(LOG_DIR, exist_ok=True)
  9. def _build_daily_log_path(name: str) -> str:
  10. # 每天一个独立文件:pdd_new2_2026-04-24.log
  11. date_str = datetime.now().strftime("%Y-%m-%d")
  12. return str(Path(LOG_DIR, f"{name}_{date_str}.log").resolve())
  13. def setup_logger(name: str = "pdd_spider"):
  14. logger = logging.getLogger()
  15. logger.setLevel(logging.INFO)
  16. fmt = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
  17. target_file = _build_daily_log_path(name)
  18. # 控制台 handler 去重
  19. has_console = any(type(h) is logging.StreamHandler for h in logger.handlers)
  20. if not has_console:
  21. console = logging.StreamHandler()
  22. console.setFormatter(fmt)
  23. logger.addHandler(console)
  24. # 文件 handler 按“目标文件路径”去重
  25. has_target_file = False
  26. for handler in logger.handlers:
  27. if isinstance(handler, TimedRotatingFileHandler):
  28. base_filename = str(Path(getattr(handler, "baseFilename", "")).resolve())
  29. if base_filename == target_file:
  30. has_target_file = True
  31. break
  32. if not has_target_file:
  33. file_handler = TimedRotatingFileHandler(
  34. filename=target_file,
  35. when='midnight',
  36. interval=1,
  37. encoding='utf-8',
  38. backupCount=30
  39. )
  40. # 文件名已自带日期,这里保留 suffix 仅作兼容(通常不会触发)
  41. file_handler.suffix = "%Y-%m-%d"
  42. file_handler.setFormatter(fmt)
  43. logger.addHandler(file_handler)
  44. logger.propagate = False
  45. return logger