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("严重错误信息")