You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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=off
    
    修改后执行systemctl restart apache2重启服务生效,之后所有应用日志只会按你自定义的Log类配置写入指定轮转文件。
  • 方案2:给mod_wsgi的默认处理器设置级别阈值
    如果需要保留WARNING及以上级别的日志同步到Apache error.log,可在WSGI入口文件初始化自定义Log类之前,添加如下代码调整mod_wsgi默认处理器的日志级别:
    import logging
    for handler in logging.root.handlers:
        if isinstance(handler, logging.StreamHandler) and getattr(handler.stream, 'name', '') == '<wsgi.errors>':
            handler.setLevel(logging.WARNING)
    
    配置后仅WARNING、ERROR、CRITICAL级别的日志会写入Apache error.log,INFO、DEBUG级别日志仅走自定义文件输出。
  • 方案3:关闭自定义logger的向上传播属性(最推荐,无侵入不依赖Apache配置)
    在你的Log类初始化代码中,给Open-Capture logger添加propagate = False配置,阻止日志事件向根logger冒泡传递,从根源上避免日志被根logger上的其他处理器捕获:
    # 放在self.LOGGER.setLevel(logging.DEBUG) 这行后面即可
    self.LOGGER.propagate = False
    
    该修改不需要调整Apache配置,重启WSGI应用进程即可生效,自定义logger产生的所有日志只会交给你挂载的RotatingFileHandler处理,不会再流入Apache error.log。

内容的提问来源于stack exchange,提问作者Nathan30

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 13:45:33