# mt_spider/logger.py import os import logging from datetime import datetime from pathlib import Path from logging.handlers import TimedRotatingFileHandler LOG_DIR = os.path.join(os.path.dirname(__file__), '..', 'logs') os.makedirs(LOG_DIR, exist_ok=True) def _build_daily_log_path(name: str) -> str: # 每天一个独立文件:pdd_new2_2026-04-24.log date_str = datetime.now().strftime("%Y-%m-%d") return str(Path(LOG_DIR, f"{name}_{date_str}.log").resolve()) def setup_logger(name: str = "pdd_spider"): logger = logging.getLogger() logger.setLevel(logging.INFO) fmt = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s') target_file = _build_daily_log_path(name) # 控制台 handler 去重 has_console = any(type(h) is logging.StreamHandler for h in logger.handlers) if not has_console: console = logging.StreamHandler() console.setFormatter(fmt) logger.addHandler(console) # 文件 handler 按“目标文件路径”去重 has_target_file = False for handler in logger.handlers: if isinstance(handler, TimedRotatingFileHandler): base_filename = str(Path(getattr(handler, "baseFilename", "")).resolve()) if base_filename == target_file: has_target_file = True break if not has_target_file: file_handler = TimedRotatingFileHandler( filename=target_file, when='midnight', interval=1, encoding='utf-8', backupCount=30 ) # 文件名已自带日期,这里保留 suffix 仅作兼容(通常不会触发) file_handler.suffix = "%Y-%m-%d" file_handler.setFormatter(fmt) logger.addHandler(file_handler) logger.propagate = False return logger