简述,细节展示不清楚的地方多看一下python的logging模块
留言交流(需FQ)可以移步我的博客
使用 Flask 时,如何优雅的输出日志。这些日志也许需要特定的格式,更丰富的信息,或者添加一些上下文的信息(如当前登录的用户名)等等。
根据官方文档来看,当想要为项目配置日志时,应当在程序启动时尽早进行配置。比如在flask_app = Flask(‘api-controller’)之前配置。
如果不配置,flask 会create_logger
default_handler = logging.StreamHandler(wsgi_errors_stream)
default_handler.setFormatter(
logging.Formatter("[%(asctime)s] %(levelname)s in %(module)s: %(message)s")
)
如果在操作 app.logger 之后配置日志,并且需要 移除缺省的日志记录器,可以导入并移除它:
from flask.logging import default_handler
flask_app.logger.removeHandler(default_handler)
实际上,在设置完 basicConfig 后也可以通过下面方式修改。这段代码的影响是**在所有日志后面增加一个上下文参数(当前登录的用户名)
from flask import g
username = g.user.name
root = logging.getLogger()
handler = logging.StreamHandler()
formatter = logging.Formatter('%(asctime)s %(name)s %(levelname)-8s %(message)s' + f" User: {username}")
handler.setFormatter(formatter)
root.handlers = [handler]
应用程序代码可以在一个模块中定义和配置父记录器,并在单独的模块中创建(但不配置)子记录器,并且对子记录器的所有调用都将传递给父记录器。
比如上面的 logging.getLogger() # 同 logging.getLogger(’’) 其实就是获取了 root logger 并作修改。
上述代码写在 @app.before_request函数中,会对所有的日志输出有影响; 如果写在@app.after_request函数中,只会影响werkzeug的日志输出。 比如在flask应用中我们的目录为app
# create logger with app and config it
logging.getLogger("app").setLevel(log_level)
那么所有的 app.* 文件下的 logger 都会这个父记录器的影响。