2015-08-18 63 views
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.pyLOGGING變量:

'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,但不幸的是我使用龍捲風(請求在同一個線程中運行),這意味着我不能事件使用線程本地上下文。過濾器是獲取日誌條目的自定義變量的唯一解決方法嗎?

回答

1

剛剛找到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') 
相關問題