Python WSGI应用INFO级别日志写入Apache2 error.log问题求助
问题根因
mod_wsgi 启动Python WSGI应用时,会自动在Python logging的根logger上挂载一个指向wsgi.errors流的StreamHandler,且默认不设置日志级别过滤,所有级别的日志都会被这个处理器捕获,写入Apache的error.log文件。
你当前的自定义Log类仅清空了Open-Capture命名logger自身挂载的handler,既没有阻止日志向根logger传播,也没有处理mod_wsgi挂在根logger上的默认处理器,因此即使配置了独立的轮转文件日志,INFO级别的日志依然会被同步写到Apache错误日志中。
日志里的
[wsgi:error]是mod_wsgi固定的日志通道标记,不代表对应日志是错误级别,所有经mod_wsgi输出的日志都会带这个标记。
解决方案
按优先级选其中一种即可,优先推荐第三种,最稳妥:
- 方案1:完全关闭mod_wsgi的日志接管
修改Apache站点配置中的WSGIDaemonProcess配置行,添加python-handler=off参数,禁止mod_wsgi自动挂载日志处理器:
修改后执行WSGIDaemonProcess opencapture_runtime user=nathan group=nathan threads=5 python-handler=offsystemctl restart apache2重启服务生效,之后所有应用日志只会按你自定义的Log类配置写入指定轮转文件。 - 方案2:给mod_wsgi的默认处理器设置级别阈值
如果需要保留WARNING及以上级别的日志同步到Apache error.log,可在WSGI入口文件初始化自定义Log类之前,添加如下代码调整mod_wsgi默认处理器的日志级别:
配置后仅WARNING、ERROR、CRITICAL级别的日志会写入Apache error.log,INFO、DEBUG级别日志仅走自定义文件输出。import logging for handler in logging.root.handlers: if isinstance(handler, logging.StreamHandler) and getattr(handler.stream, 'name', '') == '<wsgi.errors>': handler.setLevel(logging.WARNING) - 方案3:关闭自定义logger的向上传播属性(最推荐,无侵入不依赖Apache配置)
在你的Log类初始化代码中,给Open-Capturelogger添加propagate = False配置,阻止日志事件向根logger冒泡传递,从根源上避免日志被根logger上的其他处理器捕获:
该修改不需要调整Apache配置,重启WSGI应用进程即可生效,自定义logger产生的所有日志只会交给你挂载的RotatingFileHandler处理,不会再流入Apache error.log。# 放在self.LOGGER.setLevel(logging.DEBUG) 这行后面即可 self.LOGGER.propagate = False
内容的提问来源于stack exchange,提问作者Nathan30
相关产品推荐
相关产品推荐

