Модуль ведения журнала Python: регистратор повторяет сообщение все больше и больше по мере запуска скрипта

#python #logging #spyder

#python #ведение журнала #spyder

Вопрос:

Итак, у меня возникла эта странная проблема в моей среде разработки Spyder (и только в Spyder). Я инициализирую регистратор с помощью модуля ведения журнала, и каждый раз, когда я запускаю скрипт, сообщения печатаются все больше и больше раз (один раз с первой попытки, два раза со второй, три раза с третьей и т. Д.). Есть идеи, почему? Код:

 import logging


logger = logging.getLogger(__name__)

handle = logging.StreamHandler()
logger.addHandler(handle)
handle.setLevel(logging.DEBUG)

formatter = logging.Formatter(fmt='%(asctime)s - %(levelname)s - %(message)s')
handle.setFormatter(formatter)

logger.warning('Testing')
  

Заранее спасибо!

РЕДАКТИРОВАТЬ: это то, что я вижу в своей консоли после двух попыток:

регистратор.предупреждение («Тестирование») 2020-09-30 15:34:34,763 — ПРЕДУПРЕЖДЕНИЕ — Тестирование

регистратор.предупреждение («Тестирование») 2020-09-30 15:34:38,476 — ПРЕДУПРЕЖДЕНИЕ — Тестирование 2020-09-30 15:34:38,476 — ПРЕДУПРЕЖДЕНИЕ — Тестирование

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

1. Как вы запускаете свой код?

2. Код работает нормально

3. Разработайте свои способы использования и механизмы запуска

4. Я буквально просто запускаю фрагмент кода, нажав кнопку запуска скрипта…

5. Это происходит потому, что вы не удаляете обработчик. Каждый раз, когда вы вызываете AddHandler, он добавляет новый обработчик, и, поскольку они никогда не очищаются, все они пишут одно и то же сообщение. Попробуйте закрыть обработчик handle.close() и удалить его logger.removeHandler(handle) в конце скрипта. @LoloTheKid

Ответ №1:

Модуль ведения журнала использует статический объект logger, который находится в вашем сеансе python. Итак, каждый раз, когда вы запускаете свой скрипт, addHandler будет добавляться новый обработчик logger.handlers . Вы можете добавить строку в свой скрипт, который печатает logger.handlers и проверяет.

 ...
logger.addHandler(handle)
print(logger.handlers)
...
  

И каждый раз, когда вы вызываете logger.warning сообщение, оно будет печататься столько раз, сколько у вас обработчиков.

Чтобы исправить это, вам нужно удалить обработчик:

 ...
logger.warning('Testing')
logger.removeHandler(handle)
  

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

 ...
if not logger.handlers:
    handle = logging.StreamHandler()
    formatter = logging.Formatter(fmt='%(asctime)s - %(levelname)s - %(message)s')
    handle.setFormatter(formatter)
    handle.setLevel(logging.DEBUG)
    logger.addHandler(handle)
...
  

Вы также можете сначала рассмотреть возможность удаления всех обработчиков.