使用logging模块时如何阻止CherryPy向stdout输出日志?
解决CherryPy日志重复输出问题
要阻止CherryPy直接向stdout输出日志,仅保留logging模块的统一日志控制,可通过移除CherryPy自带的日志处理器实现,具体操作如下:
实现步骤
- 保留你的基础logging配置:
import logging logging.basicConfig(level=logging.INFO)
- 导入CherryPy后,清除其默认日志处理器:
import cherrypy # 遍历CherryPy核心日志记录器,移除自带处理器 for logger_name in ['cherrypy.error', 'cherrypy.access']: logger = logging.getLogger(logger_name) # 移除所有默认绑定的处理器 for handler in logger.handlers[:]: logger.removeHandler(handler)
原理说明
CherryPy默认会为自身的日志记录器(如cherrypy.error、cherrypy.access)添加独立的StreamHandler,直接输出到stdout。当你配置Python标准logging模块后,日志会同时被CherryPy的处理器和root logger的处理器输出,导致重复。移除CherryPy自带的处理器后,日志会通过默认的propagate=True设置传递到root logger,由你配置的logging统一管控。
效果验证
修改后,日志输出将仅保留logging模块的格式,示例如下:
INFO:cherrypy.error:[02/Jun/2023:11:17:54] ENGINE Bus STARTING INFO:cherrypy.error:[02/Jun/2023:11:17:54] ENGINE Started monitor thread 'Autoreloader'. INFO:cherrypy.error:[02/Jun/2023:11:17:54] ENGINE Serving on http://0.0.0.0:5005 INFO:cherrypy.error:[02/Jun/2023:11:17:54] ENGINE Bus STARTED
内容的提问来源于stack exchange,提问作者Bart Friederichs
相关产品推荐
相关产品推荐

