как получить согласованный формат ведения журнала Python?

#python #logging

#питон #ведение журнала

Вопрос:

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

У меня есть что-то вроде

 import logging
logging.basicConfig(format='%(message)s')
 

но все журналы по-прежнему выходят с тайм-кодом и т.д.

Я где-то читал о том, как формат ведения журнала наследуется.

Я пробовал добавлять это во многие разные файлы на случай, если каким-то образом first столкновение с конфигурацией ведения журнала установит его для всего сеанса.

Единственный способ, которым я могу заставить это придерживаться, — создать пользовательский регистратор в каждом файле, что утомительно с подобным:

 logger = logging.getLogger('name')
# then configure and use logger.info() etc.
 

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

Комментарии:

1. Используете ли вы django? Попробуйте посмотреть на lincolnloop.com/blog/django-logging-right-way

Ответ №1:

Вы правы в том, что первый вызов конфигурации ведения журнала устанавливает его для всего сеанса. На самом деле это ожидаемое поведение. Смотрите документы:

Вызов to basicConfig() должен предшествовать любым вызовам debug() и info() т. Д. Поскольку он предназначен для одноразовой простой настройки, только первый вызов действительно что-то сделает: последующие вызовы фактически не выполняются.


Поэтому вы должны найти первую конфигурацию и установить там свой формат журнала, удалив все последующие конфигурации.

Однако, если это практически невозможно, то начиная с Python 3.8 существует обходной путь, позволяющий принудительно перенастроить систему ведения журнала:

 logging.basicConfig(format='%(message)s', level=logging.INFO, force=True)
 

ДЕМОНСТРАЦИЯ:

 import logging 

log = logging.getLogger(__name__)

logging.basicConfig(format='%(levelname)s %(message)s', level=logging.INFO)
log.info("first")
logging.basicConfig(format='%(message)s', level=logging.INFO, force=True)
log.info("second")
 

Выводит:

 INFO first
second
 

Комментарии:

1. спасибо за это, но force , похоже, не работает. как бесит. буквально первая строка первого файла — это конфигурация протоколирования, а затем тестовый журнал.

2. @dcsan force действительно работает, добавлен демонстрационный скрипт. Можете ли вы создать воспроизводимый пример, в котором он не работает?

3. спасибо за комментарий. его немного сложно извлечь, так как это большой многофайловый проект.