Ведение журнала Python всегда печатает сообщение на консоли без причины

#python #logging #python-logging

#питон #регистрация #python-ведение журнала

Вопрос:

У меня есть код, который работает, но делает вещи, которые я не понимаю. В этом коде используется logging модуль python. Проблема в том, что когда я запускаю этот скрипт, на консоли всегда есть (в дополнение к обычному журналу потоков) строка, которая мне не нужна (вторая строка в STDOUT внизу этого поста).

Я не понимаю, почему существует эта линия и как решить эту проблему.

Я думаю, что эта проблема связана с использованием logging.basicConfig(level=logging.INFO) , но мне нужно ее использовать, потому что, если я ее не использую, logger.info('This is a INFO-01') не работает только ПРЕДУПРЕЖДЕНИЕ об уровне и т. Д… Я попробовал несколько вещей, но это просто привело к ошибкам и не нашло ответа в Интернете.

 import logging  logging.basicConfig(level=logging.INFO)  logger = logging.getLogger(__name__)  c_handler = logging.StreamHandler() f_handler = logging.FileHandler('file07.log') c_handler.setLevel(logging.INFO) f_handler.setLevel(logging.INFO)  c_format = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s') f_format = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s') c_handler.setFormatter(c_format) f_handler.setFormatter(f_format)  logger.addHandler(c_handler) logger.addHandler(f_handler)   logger.info('This is a INFO-01')  

ВЫХОД ИЗ СТРОЯ:

 2021-12-11 17:54:30,203 - INFO - This is a INFO-01 INFO:__main__:This is a INFO-01  

Если кто-нибудь сможет мне помочь, я буду очень благодарен. Сердечно

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

1. Вы используете basicConfig() , который добавляет обработчик, а затем вручную добавляете дополнительные обработчики. Неудивительно, что ты получаешь реплики не один раз.

Ответ №1:

Вы правильно угадали. Взгляните на это изображение из документации.

По умолчанию распространение равно True . Таким образом, у вашего logger объекта есть родительский регистратор с именем «root».

basicConfig по сути, выполняет базовую настройку системы ведения журнала, создавая StreamHandler форматер по умолчанию и добавляя его в корневой регистратор.

«Корень» является родителем всех регистраторов. Поэтому после того, как обработчики вашего logger регистратора обработают сообщение, оно будет передано обработчикам родительского регистратора, и поскольку теперь у него есть обработчик, оно выводит это сообщение во второй раз в формате по умолчанию.

Вы можете удалить это, потому что вам это не нужно. Не забудьте указать УРОВЕНЬ для вашего logger : (я удалил f_handler обработчик в приведенном ниже коде)

 import logging  logger = logging.getLogger(__name__) logger.setLevel(logging.INFO) # lt;----- here  c_handler = logging.StreamHandler() c_handler.setLevel(logging.INFO)  c_format = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s') c_handler.setFormatter(c_format)  logger.addHandler(c_handler)  logger.info('This is a INFO-01')  

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

1. Спасибо. Это действительно полезно.