使用Scrapy的CrawlerRunner时无法自定义日志级别求助
解决Scrapy CrawlerRunner自定义日志级别问题
我正在使用CrawlerRunner运行Scrapy爬虫,需要自定义日志级别。官方文档建议使用configure_logging,但该函数会分别为Scrapy和Twisted日志记录器设置DEBUG和ERROR级别,无法满足我的需求。
尝试了几种方法均未成功:
- 仅使用configure_logging,日志正常输出但级别始终为DEBUG;
- 仅使用logging.basicConfig设置INFO级别,完全无日志输出;
- 同时使用两者,结果与仅用configure_logging一致;
- 在settings.py中设置LOG_LEVEL,无任何效果。
核心思路
问题出在configure_logging默认未加载项目配置、且强制设置了Twisted日志级别为ERROR。我们需要:
- 让
configure_logging读取项目settings中的日志配置 - 手动调整Twisted日志器的级别以匹配需求
修改后的代码
替换原有的setup_logging函数,并确保settings.py中配置了目标日志级别:
1. 调整setup_logging函数
def setup_logging(): # 获取项目配置,优先读取settings.py中的LOG_LEVEL settings = get_project_settings() target_log_level = settings.get('LOG_LEVEL', 'INFO') # 默认用INFO # 传入settings调用configure_logging,让它读取项目配置的日志级别 configure_logging(settings=settings, install_root_handler=True) # 调整Twisted日志器级别(默认是ERROR,改为目标级别) twisted_logger = logging.getLogger('twisted') twisted_logger.setLevel(target_log_level) # 确保Scrapy主日志器级别正确(可选,防止配置未生效) scrapy_logger = logging.getLogger('scrapy') scrapy_logger.setLevel(target_log_level)
2. 在settings.py中配置日志级别
# settings.py 中添加 LOG_LEVEL = 'INFO' # 可替换为WARNING、ERROR等你需要的级别
为什么之前的方法失败?
- 仅用configure_logging():未传入settings参数,函数使用默认值(Scrapy为DEBUG,Twisted为ERROR),完全忽略项目配置。
- 仅用logging.basicConfig:Scrapy的日志系统会替换Python标准库的根日志处理器,导致basicConfig的设置被覆盖,无日志输出。
- 同时使用两者:
configure_logging会优先初始化日志系统,覆盖basicConfig的配置,结果等同于仅用configure_logging。 - settings.py中设置LOG_LEVEL:因为
configure_logging未加载项目settings,所以根本没读取到这个配置项。
验证效果
启动爬虫后,日志会按照你在settings.py中设置的级别输出,同时Twisted的日志也会同步使用该级别,不再仅显示ERROR信息。
内容的提问来源于stack exchange,提问作者Варков Эмир
相关产品推荐
相关产品推荐

