使用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
相关产品推荐
相关产品推荐

