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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 21:41:11