Flask蓝图日志模块名显示异常,如何指定自定义日志模块名?
解决Flask Blueprint钩子日志模块名显示问题
我来帮你搞定这个问题!其实原因很简单:你的log_incoming_request钩子函数是定义在flask_api_blueprint.py这个模块里的,当你调用myLoggerFile.getLogger()时,默认会把当前模块的名字(也就是flask_api_blueprint)作为logger的标识,所以日志里才会显示这个名字。要让它显示flask_api_example,试试下面这几种方法:
方法一:直接指定Logger的名字
这是最直接的办法,在蓝图的钩子函数里调用getLogger()时,显式传入主应用模块的名字:
修改flask_api_blueprint.py的代码:
from flask import Blueprint from myLogger import myLoggerFile api_blueprint = Blueprint('api_blueprint', __name__) @api_blueprint.before_app_request def log_incoming_request(): # 显式指定logger的名称为"flask_api_example" myLoggerFile.getLogger("flask_api_example").info("INCOMING REQUEST")
这样日志里的模块名就会变成你想要的flask_api_example了。
方法二:通过应用上下文获取主应用Logger
如果不想硬编码模块名,也可以利用Flask的应用上下文,通过current_app获取主应用的logger,这样更灵活:
修改flask_api_blueprint.py:
from flask import Blueprint, current_app from myLogger import myLoggerFile api_blueprint = Blueprint('api_blueprint', __name__) @api_blueprint.before_app_request def log_incoming_request(): # 用current_app.name来获取主应用的模块名,传给自定义Logger logger = myLoggerFile.getLogger(current_app.name) logger.info("INCOMING REQUEST")
这种方法的好处是,以后如果主应用的模块名改了,你不用修改蓝图里的代码,它会自动适配。
方法三:注册蓝图时传递主应用Logger
你还可以在主应用里把自己的logger传给蓝图,然后在钩子函数里使用:
- 先给蓝图添加一个logger属性,在
flask_api_blueprint.py里:
from flask import Blueprint from myLogger import myLoggerFile api_blueprint = Blueprint('api_blueprint', __name__) # 先初始化一个默认logger,后面会被主应用覆盖 api_blueprint.logger = myLoggerFile.getLogger()
- 在
flask_api_example.py注册蓝图前,把主应用的logger赋值给蓝图:
from flask import Flask from flask_api_blueprint import api_blueprint from myLogger import myLoggerFile app = Flask(__name__) # 将主应用的logger传给蓝图 api_blueprint.logger = myLoggerFile.getLogger() app.register_blueprint(api_blueprint) logger = myLoggerFile.getLogger()
- 最后在钩子函数里使用蓝图的logger:
@api_blueprint.before_app_request def log_incoming_request(): api_blueprint.logger.info("INCOMING REQUEST")
这三种方法都能解决你的问题,你可以根据自己的项目情况选最合适的~
内容的提问来源于stack exchange,提问作者MeisterEder7
相关产品推荐
相关产品推荐

