Как вводить переменные в форматор журнала?

В настоящее время у меня есть:

FORMAT = '%(asctime)s - %(levelname)s - %(message)s' logging.basicConfig(format=FORMAT, datefmt='%d/%m/%Y %H:%M:%S', filename=LOGFILE, level=getattr(logging, options.loglevel.upper())) 

… который отлично работает, однако я стараюсь:

 FORMAT = '%(MYVAR)s %(asctime)s - %(levelname)s - %(message)s' 

и это просто бросает keyerrors, хотя MYVAR определен.

Есть ли обходной путь? MYVAR является константой, поэтому было бы стыдно, что нужно передать все, что я вызываю регистратор.

Спасибо!

3 Solutions collect form web for “Как вводить переменные в форматор журнала?”

Вы можете использовать собственный фильтр :

 import logging MYVAR = 'Jabberwocky' class ContextFilter(logging.Filter): """ This is a filter which injects contextual information into the log. """ def filter(self, record): record.MYVAR = MYVAR return True FORMAT = '%(MYVAR)s %(asctime)s - %(levelname)s - %(message)s' logging.basicConfig(format=FORMAT, datefmt='%d/%m/%Y %H:%M:%S') logger = logging.getLogger(__name__) logger.addFilter(ContextFilter()) logger.warning("'Twas brillig, and the slithy toves") 

доходность

 Jabberwocky 24/04/2013 20:57:31 - WARNING - 'Twas brillig, and the slithy toves 

Вы можете использовать собственный Filter , как говорит unutbu , или вы можете использовать LoggerAdapter :

 import logging logger = logging.LoggerAdapter(logging.getLogger(__name__), {'MYVAR': 'Jabberwocky'}) FORMAT = '%(MYVAR)s %(asctime)s - %(levelname)s - %(message)s' logging.basicConfig(format=FORMAT, datefmt='%d/%m/%Y %H:%M:%S') logger.warning("'Twas brillig, and the slithy toves") 

который дает

Jabberwocky 25/04/2013 07:39:52 – ПРЕДУПРЕЖДЕНИЕ – 'Twas brillig, и slithy toves

Кроме того, просто передайте информацию при каждом вызове:

 import logging logger = logging.getLogger(__name__) FORMAT = '%(MYVAR)s %(asctime)s - %(levelname)s - %(message)s' logging.basicConfig(format=FORMAT, datefmt='%d/%m/%Y %H:%M:%S') logger.warning("'Twas brillig, and the slithy toves", extra={'MYVAR': 'Jabberwocky'}) 

что дает тот же результат.

Поскольку MYVAR практически постоянна, подход LoggerAdapter требует меньше кода, чем подход Filter в вашем случае.

 locals() FORMAT = '%(MYVAR)s %(asctime)s - %(levelname)s - %(message)s' 

locals () должен возвращать словарь всех доступных локально переменных, а затем ошибку. Если вы не видите его там, то он не доступен локально. Это докажет, что оно не определено должным образом. Нам понадобится больше кода, чтобы определить, было ли оно определено неправильно. В качестве альтернативы вы можете попробовать «globals ()», чтобы проверить глобальные … но вы, вероятно, не ставите «глобальный MYVAR» в определение, которое выводит FORMAT

Python - лучший язык программирования в мире.