2015-08-18 3 views
1

Я хочу добавить session_id к каждому сообщению журнала. Поэтому я могу сделать это в каждом запросе таким образом.Можно ли вставлять переменную в журнал регистрации python. Фильтр

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 + смерч, так что я изменить LOGGING переменную в settings.py:

'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 каждый раз, когда я что-то записываю. Конечно, я могу обернуть каждый метод logger (трассировка, информация, отладка ...) и добавить туда функции сеанса, но это сломает номер строки.

Я бы сделал что-то вроде статической переменной и статического сеттера в ContextFilter, но, к сожалению, я использую использование торнадо (запрос выполняется в том же потоке), что означает, что я не могу использовать контекстный контекст потока событий. Является ли фильтр единственным обходным путем для получения пользовательской переменной для входа в журнал?

ответ

1

Только что нашел answer. Я должен использовать LoggingAdapter вместо фильтра.

class A(object): 

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

    def process(self): 
    self.logger.info('hello') 
Смежные вопросы