【发布时间】:2015-08-18 19:00:37
【问题描述】:
我想在每条日志消息中添加session_id。所以我可以用这种方式在每个请求中做到这一点。
log.info('[%s] my message', self.session_id);
甚至是handler。但是每次我记录某些内容时,它都需要将%s 和会话变量传递给记录方法。好吧,为了跳过肮脏的工作,我可以创建一个filter:
class ContextFilter(logging.Filter):
def filter(self, record):
record.my_session = 'LOL'
return True
我正在使用 django + tornado,所以我修改了 settings.py 中的 LOGGING 变量:
'filters': {
'user_filter': {
'()': 'my_package.ContextFilter',
}
},
'formatters': {
'verbose': {
'format': '[%(asctime)s %(my_session)s] %(message)s',
},
},
如果我写这样的东西:
class A(object):
def __init__(self):
self.session_id = random(1024)
def process(self):
log.info('hello')
我会得到:
[11:23 LOL] hello.
好的,现在我想注入A.session_id 来过滤而不是LOL。请注意,每次我记录某些内容时,session_id 都在A 的范围内定义。当然,我可以包装每一个记录器方法(跟踪、信息、调试......)并在那里添加会话功能,但这会破坏行号。
我会在ContextFilter 中执行类似静态变量和静态设置器的操作,但不幸的是我正在使用 tornado(请求在同一个线程中运行),这意味着我不能使用线程本地上下文。过滤器是获取日志条目自定义变量的唯一解决方法吗?
【问题讨论】: