| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- import logging
- from logging.handlers import TimedRotatingFileHandler
- import os
- from datetime import datetime
- # 当前设备ID(由入口脚本通过 set_device_id 设置,日志格式里引用)
- CURRENT_DEVICE_ID = "unknown"
- def set_device_id(device_id):
- """入口脚本调用:设置当前设备ID,之后所有日志自动带上"""
- global CURRENT_DEVICE_ID
- CURRENT_DEVICE_ID = str(device_id or "unknown")
- class DeviceIdFilter(logging.Filter):
- """运行时读取模块级 CURRENT_DEVICE_ID,注入每条日志"""
- def filter(self, record):
- record.device_id = CURRENT_DEVICE_ID
- return True
- LOG_FORMAT = "%(asctime)s [%(levelname)s] [%(device_id)s] %(message)s"
- def _build_logger(name: str, log_file: str) -> logging.Logger:
- logger_obj = logging.getLogger(name)
- if logger_obj.handlers:
- return logger_obj
- logger_obj.setLevel(logging.DEBUG)
- logger_obj.propagate = False
- console_handler = logging.StreamHandler()
- console_handler.setLevel(logging.INFO)
- file_handler = logging.FileHandler(log_file, encoding="utf-8")
- file_handler.setLevel(logging.DEBUG)
- _device_filter = DeviceIdFilter()
- formatter = logging.Formatter(LOG_FORMAT)
- console_handler.setFormatter(formatter)
- file_handler.setFormatter(formatter)
- console_handler.addFilter(_device_filter)
- file_handler.addFilter(_device_filter)
- logger_obj.addHandler(console_handler)
- logger_obj.addHandler(file_handler)
- return logger_obj
- def get_spider_logger(spider_name: str) -> logging.Logger:
- base_dir = os.path.join("logs", spider_name)
- os.makedirs(base_dir, exist_ok=True)
- today_str = datetime.now().strftime("%Y-%m-%d")
- log_file = os.path.join(base_dir, f"taobao_{today_str}.log")
- return _build_logger(f"spider.{spider_name}", log_file)
- # 获取今天日期字符串
- today_str = datetime.now().strftime("%Y-%m-%d")
- legacy_dir = "logs"
- os.makedirs(legacy_dir, exist_ok=True)
- legacy_file = os.path.join(legacy_dir, f"taobao_{today_str}.log")
- logger = _build_logger("MyLogger", legacy_file)
- # 测试
- # logger.debug("调试信息")
- # logger.info("普通提示信息")
- # logger.warning("警告信息")
- # logger.error("错误信息")
- # logger.critical("严重错误信息")
|