1
我想將session_id
添加到每條日誌消息。所以我可以在每個請求中這樣做。是否有可能向python logger注入一個變量Filter
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 +龍捲風所以我修改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
,但不幸的是我使用龍捲風(請求在同一個線程中運行),這意味着我不能事件使用線程本地上下文。過濾器是獲取日誌條目的自定義變量的唯一解決方法嗎?