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

Gunicorn+Nginx部署Flask后Python通用错误未写入日志的问题

Flask + Gunicorn:未捕获Python原生异常自动入日志的配置方案

问题场景

部署Flask应用到Gunicorn+Nginx环境后,未捕获的Python原生异常(如字典访问不存在的键)无法自动写入指定日志文件,仅手动用try/except捕获并打印时才会出现在日志中。现有配置仅让Flask的app.logger复用了Gunicorn的日志处理器,但全局异常未关联到该日志系统。

现有配置

初始化文件init.py日志代码

gunicorn_error_logger = logging.getLogger('gunicorn.error')
if (app.logger.hasHandlers()):
    app.logger.handlers.clear()
app.logger.handlers.extend(gunicorn_error_logger.handlers)
app.logger.setLevel(logging.DEBUG)
config[config_name].init_app(app)

业务日志调用示例

from flask import current_app
current_app.logger.debug("Register member to DB")

Gunicorn启动命令

/opt/app_name/venv/bin/gunicorn --bind unix:/opt/app_name/venv/app_name.sock --log-file /opt/app_name/app_name.log --log-level DEBUG --reload --workers=2 run:app

解决步骤

核心是把Python根日志的处理器替换为Gunicorn的日志处理器,让全局未捕获异常被Gunicorn日志系统捕获。

  1. 修改init.py的日志配置
    在原有代码基础上添加根日志的配置:

    import logging
    
    gunicorn_error_logger = logging.getLogger('gunicorn.error')
    # 重置Flask应用日志处理器
    if app.logger.hasHandlers():
        app.logger.handlers.clear()
    app.logger.handlers.extend(gunicorn_error_logger.handlers)
    app.logger.setLevel(logging.DEBUG)
    
    # 配置根日志,捕获全局未处理异常
    root_logger = logging.getLogger()
    if root_logger.hasHandlers():
        root_logger.handlers.clear()
    root_logger.handlers.extend(gunicorn_error_logger.handlers)
    root_logger.setLevel(logging.DEBUG)
    
    config[config_name].init_app(app)
    
  2. 验证效果
    触发任意未捕获的Python异常(如my_dict = {}; my_dict['missing_key']),此时异常栈会自动写入Gunicorn指定的/opt/app_name/app_name.log文件,无需手动捕获。

可选调整

  • 如果不需要记录全局DEBUG级别的日志,可以将root_logger.setLevel()改为logging.ERROR,仅捕获错误及以上级别的日志。
  • 若担心根日志配置影响其他模块,可针对特定模块单独配置日志处理器,但一般场景下复用Gunicorn的处理器即可满足需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 09:30:21