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日志系统捕获。
修改
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)验证效果
触发任意未捕获的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
相关产品推荐
相关产品推荐

