Gunicorn+Flask日志写入报AttributeError,求配置修复方案
问题修复方案
错误原因
你配置中使用的flask.logging.wsgi_errors_stream在Gunicorn运行环境中未被正确初始化,导致StreamHandler的stream对象为None,触发AttributeError: 'NoneType' object has no attribute 'write'。
方案一:自定义双Handler日志配置
直接在logging字典配置中添加标准输出处理器和文件处理器,替代依赖Flask内部流的配置:
修改server.py如下:
import logging import sys from flask import Flask, jsonify, request from flask.logging import default_handler configDict = { "version": 1, "formatters": { "default": { "format": "[%(asctime)s] %(levelname)s in %(module)s: %(message)s", } }, "handlers": { # 标准输出处理器 "console": { "class": "logging.StreamHandler", "stream": sys.stdout, "formatter": "default", }, # 文件处理器 "file": { "class": "logging.FileHandler", "filename": "api.log", "formatter": "default", "encoding": "utf-8", } }, "root": {"level": "INFO", "handlers": ["console", "file"]}, } app = Flask(__name__) logging.config.dictConfig(configDict) app.logger.removeHandler(default_handler) log = logging.getLogger(__name__) @app.route("/", methods=["GET"]) def home(): log.info('hello') return jsonify({"hello": "world"})
启动命令无需--log-file参数(若要保留Gunicorn自身日志写入文件,可继续使用):
gunicorn wsgi:app
方案二:复用Gunicorn日志配置(推荐)
Gunicorn默认支持同时将日志输出到标准输出和文件(指定--log-file时自动生效),让Flask日志复用Gunicorn的日志处理器,无需重复配置:
修改server.py如下:
import logging from flask import Flask, jsonify, request from flask.logging import default_handler app = Flask(__name__) # 移除Flask默认日志处理器,避免重复输出 app.logger.removeHandler(default_handler) # 获取Gunicorn的日志记录器 gunicorn_logger = logging.getLogger('gunicorn.error') # 让Flask日志复用Gunicorn的处理器和日志级别 app.logger.handlers = gunicorn_logger.handlers app.logger.setLevel(gunicorn_logger.level) # 业务日志使用Flask的logger或全局logger均可 log = app.logger @app.route("/", methods=["GET"]) def home(): log.info('hello') return jsonify({"hello": "world"})
使用原启动命令即可:
gunicorn wsgi:app --log-file api.log
此方案下,Gunicorn自身日志和Flask业务日志都会同时输出到标准输出和api.log文件。
内容的提问来源于stack exchange,提问作者gameveloster
相关产品推荐
相关产品推荐

