gpt4 book ai didi

python - 是否可以将变量注入(inject) python 记录器过滤器

转载 作者:太空宇宙 更新时间:2023-11-04 03:28:27 26 4
gpt4 key购买 nike

我想将 session_id 添加到每条日志消息中。所以我可以通过这种方式在每个请求中做到这一点。

log.info('[%s] my message', self.session_id);

甚至是 handler .但是每次我记录一些东西时,它都需要将 %s 和 session 变量传递给 log 方法。好吧,为了跳过肮脏的工作,我可以创建一个 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] 你好

好吧,现在我想注入(inject) A.session_id 来过滤而不是 LOL。请注意,每次我记录某些内容时,session_id 都在 A 的范围内定义。当然,我可以包装每个记录器方法(trace、info、debug ...)并在其中添加 session 功能,但这会中断行号。

我会在 ContextFilter 中做一些类似静态变量和静态 setter 的事情,但不幸的是我正在使用 tornado(请求在同一个线程中运行),这意味着我不能事件使用线程本地上下文。过滤器是获取日志条目自定义变量的唯一解决方法吗?

最佳答案

刚找到answer .我应该使用 LoggingAdapter 而不是 Filter。

class A(object):

def __init__(self):
self.logger = logging.LoggerAdapter(log, {'session_id': random(1024)})

def process(self):
self.logger.info('hello')

关于python - 是否可以将变量注入(inject) python 记录器过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32080616/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com