#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. спасибо за комментарий. его немного сложно извлечь, так как это большой многофайловый проект.