在平时开发中,会经常使用logging
模块输出一些信息,logging 模块内容了一些字段如: 行号,日志级别,时间,文件名,行号等等,可是我们有时候可能需要自己添加一些字段来进行标识如 request_id 而这些自定义字段是不能直接使用的,那如何实现呢?这时候我们就需要自定义 Handler来实现这个目标。
import logging
def _get_request_id():
# 利用它来生成request_id
import flask_request_id
return flask_request_id.id
def get_logger():
# request_id 就是我们自己定义的新字段
format_str = '[%(asctime)s_%(levelname)s]_[%(filename)s:%(lineno)d]_[%(request_id)s]: %(message)s'
# request_id 的值就是从这个 extra 值中动态获取的
extra = {"request_id": _get_request_id()}
loger = logging.getLogger(__name__)
stream = logging.StreamHandler()
format_ = logging.Formatter(format_str)
stream.setFormatter(format_)
loger.setLevel(logging.INFO)
loger.addHandler(stream)
loger = logging.LoggerAdapter(loger, extra)
return loger
为了使用方便我们可以将 request_id
放在flask的全局对象g
中,这样我们就可以在在请求的任何地方使用了。
from flask_request_id import RequestID
@app.before_request
def before_request():
# add request_id into global g object
g.request_id = flask_request_id.id
🎉🎉🎉