Logger.py 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. import logging
  2. from logging.handlers import TimedRotatingFileHandler
  3. import os
  4. from datetime import datetime
  5. # 当前设备ID(由入口脚本通过 set_device_id 设置,日志格式里引用)
  6. CURRENT_DEVICE_ID = "unknown"
  7. def set_device_id(device_id):
  8. """入口脚本调用:设置当前设备ID,之后所有日志自动带上"""
  9. global CURRENT_DEVICE_ID
  10. CURRENT_DEVICE_ID = str(device_id or "unknown")
  11. class DeviceIdFilter(logging.Filter):
  12. """运行时读取模块级 CURRENT_DEVICE_ID,注入每条日志"""
  13. def filter(self, record):
  14. record.device_id = CURRENT_DEVICE_ID
  15. return True
  16. LOG_FORMAT = "%(asctime)s [%(levelname)s] [%(device_id)s] %(message)s"
  17. def _build_logger(name: str, log_file: str) -> logging.Logger:
  18. logger_obj = logging.getLogger(name)
  19. if logger_obj.handlers:
  20. return logger_obj
  21. logger_obj.setLevel(logging.DEBUG)
  22. logger_obj.propagate = False
  23. console_handler = logging.StreamHandler()
  24. console_handler.setLevel(logging.INFO)
  25. file_handler = logging.FileHandler(log_file, encoding="utf-8")
  26. file_handler.setLevel(logging.DEBUG)
  27. _device_filter = DeviceIdFilter()
  28. formatter = logging.Formatter(LOG_FORMAT)
  29. console_handler.setFormatter(formatter)
  30. file_handler.setFormatter(formatter)
  31. console_handler.addFilter(_device_filter)
  32. file_handler.addFilter(_device_filter)
  33. logger_obj.addHandler(console_handler)
  34. logger_obj.addHandler(file_handler)
  35. return logger_obj
  36. def get_spider_logger(spider_name: str) -> logging.Logger:
  37. base_dir = os.path.join("logs", spider_name)
  38. os.makedirs(base_dir, exist_ok=True)
  39. today_str = datetime.now().strftime("%Y-%m-%d")
  40. log_file = os.path.join(base_dir, f"taobao_{today_str}.log")
  41. return _build_logger(f"spider.{spider_name}", log_file)
  42. # 获取今天日期字符串
  43. today_str = datetime.now().strftime("%Y-%m-%d")
  44. legacy_dir = "logs"
  45. os.makedirs(legacy_dir, exist_ok=True)
  46. legacy_file = os.path.join(legacy_dir, f"taobao_{today_str}.log")
  47. logger = _build_logger("MyLogger", legacy_file)
  48. # 测试
  49. # logger.debug("调试信息")
  50. # logger.info("普通提示信息")
  51. # logger.warning("警告信息")
  52. # logger.error("错误信息")
  53. # logger.critical("严重错误信息")