Scrapy集成自定义日志器后默认日志输出被静默的问题求助
问题根因
- 日志配置重复加载且默认禁用已有日志器
logging.config.fileConfig方法默认携带参数disable_existing_loggers=True,你每次调用utils.get_logger都会重新加载一次配置,直接把Scrapy初始化时提前创建的所有scrapy.*前缀的日志器全部禁用,所以Scrapy启动阶段的核心日志会丢失。 - logging.cfg配置不完整
你定义的[logger_scrapy]没有加入到[loggers]的keys列表中,配置本身不会生效;同时logger_scrapy缺少必要的handlers、qualname属性,就算生效也无法正常输出日志。
解决方案
步骤1:修改utils.get_logger实现,全局仅加载一次日志配置
避免重复加载配置覆盖已有日志器,同时显式指定disable_existing_loggers=False保留Scrapy的日志器:
import logging from logging import config from settings import LOG_CONF # 全局仅初始化一次日志配置 __config_initialized = False if not __config_initialized: config.fileConfig(LOG_CONF, disable_existing_loggers=False) __config_initialized = True def get_logger(logger_name): """返回指定名称的日志器""" return logging.getLogger(logger_name)
步骤2:补全logging.cfg的Scrapy日志配置
修改[loggers]节点,把scrapy加入配置列表,同时补全logger_scrapy的属性:
[loggers] # 新增scrapy到keys列表 keys=root,launcher,forum,item,pipeline,scrapy # 补全logger_scrapy配置 [logger_scrapy] level=DEBUG handlers=basic qualname=scrapy propagate=0
其中qualname=scrapy表示匹配所有scrapy.*前缀的日志器,propagate=0避免日志重复上报到根日志器产生重复输出。
步骤3:保持CrawlerProcess参数不变
继续使用install_root_handler=False,避免Scrapy自动创建根日志handler导致日志重复输出。
修改完成后重启项目即可看到自定义日志和Scrapy全阶段日志同时正常输出。
内容的提问来源于stack exchange,提问作者ffej
相关产品推荐
相关产品推荐

