![4180ec7fa8d4faa201bbf8f81bb14ee0.png](https://i-blog.csdnimg.cn/blog_migrate/b4ea8e0035a8cdcf7dc06ed3f78bc604.jpeg)
在Flask web 项目,为了根据 日志定位错误,需要使用一个 session trace id 定位一次请求下,所有的调用轨迹。一般是 将traceid作为调用参数传递给各个功能函数, 但是这样日志记录逻辑与业务逻辑耦合的较为紧密,如果以后要实现不同级别的日志定位,需要改动代码的位置比较多。
这里使用 logging 的自定义filter 功能,实现了记录调用上下文与调用逻辑解耦:
class ContextFilter(logging.Filter):
"""
session 级别的上下文追踪, 因为 logging 是单例模式, 所以 在__init__.py取出指定的logger
实例, 注册一次就可以了, 然后再session 开始的时候, 更新一下 sessionId 就可以了
"""
sessionId = "session_unknown"
def filter(self, record):
record.sessionId = self.sessionId
return True
# 这里注册session 上下文追踪一次就可以了
contextFilter = ContextFilter()
logger = logging.getLogger('app')
logger.addFilter(contextFilter)
修正, 上面的sessionid 设置方式在多线程中可能存在数据污染的问题,这里在 filter 保存 flask
的request对象, request 是一个 localproxy 类型的对象, 保证程序在任何位置调用的都是当前线程的request 实例(参考为:flask基础之LocalProxy代理对象(八) - 天宇之游 - 博客园 )
class ContextFilter(logging.Filter):
"""
session 级别的上下文追踪, 因为 logging 是单例模式, 所以 在__init__.py取出指定的logger
实例, 注册一次就可以了, 然后再session 开始的