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

使用Uvicorn等ASGI服务器部署Flask应用时logger日志功能失效问题

问题根因

你将原始Flask应用实例通过WsgiToAsgi包装后,重新赋值给了原来的app变量,此时视图函数中引用的app已经是WsgiToAsgi类的实例,而非原来的Flask应用实例,自然不存在logger属性。

解决方案

方案1:不覆盖原始Flask实例变量

将包装后的ASGI实例赋值给新的变量,避免覆盖原来的Flask应用实例变量,运行服务时指定新变量即可。
修改后的代码如下:

from flask import Flask
from asgiref.wsgi import WsgiToAsgi

# 保留原始Flask实例的变量名
app = Flask(__name__)

@app.route("/")
def hello_world():
    app.logger.info("hey I am your favourite log message")
    return "<p>Hello, World!</p>"

# 包装后的ASGI实例使用新变量名,不覆盖原有app
asgi_app = WsgiToAsgi(app)

运行命令调整为:

uvicorn app:asgi_app

方案2:使用Flask内置的current_app获取应用实例

这是Flask官方推荐的用法,在请求上下文内通过current_app获取当前激活的Flask应用实例,不受全局变量命名变更的影响。
修改后的代码如下:

from flask import Flask, current_app
from asgiref.wsgi import WsgiToAsgi

app = Flask(__name__)

@app.route("/")
def hello_world():
    current_app.logger.info("hey I am your favourite log message")
    return "<p>Hello, World!</p>"

app = WsgiToAsgi(app)

运行命令无需调整,还是uvicorn app:app即可。

方案3:提前单独提取logger实例

如果需要在全局多处使用日志,也可以提前将Flask应用的logger实例提取为单独变量,后续直接调用该变量即可:

from flask import Flask
from asgiref.wsgi import WsgiToAsgi

app = Flask(__name__)
# 提前提取logger实例
logger = app.logger

@app.route("/")
def hello_world():
    logger.info("hey I am your favourite log message")
    return "<p>Hello, World!</p>"

app = WsgiToAsgi(app)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 10:06:01