Spyder IDE;сброс состояния консоли IPython из-за странной проблемы с журналированием - PullRequest
0 голосов
/ 06 декабря 2018

В одном из скриптов ведение журнала настроено так:

logging configuration - two handlers
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
fh = logging.FileHandler('logfile')
fh.setLevel(logging.DEBUG)
ch = logging.StreamHandler()
ch.setLevel(logging.ERROR)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh.setFormatter(formatter)
ch.setFormatter(formatter)
logger.addHandler(fh)
logger.addHandler(ch)

Довольно обычный регистратор, верно?Конечно, все же это приводит к тому, что консоль Spyder IPython ведет себя странным образом.

Каждый последующий запуск скрипта («запуск» Spyder через внутреннюю консоль IPython) увеличивает количество раз, которое регистрируется каждое из сообщений журнала,т.е. при втором запуске сценария сообщение появляется дважды, в третий раз - три раза и т. д.

2018-12-06 17:03:44,888 - root - DEBUG - Start.
2018-12-06 17:03:44,891 - root - DEBUG - Exit.
2018-12-06 17:03:45,982 - root - DEBUG - Start.
2018-12-06 17:03:45,982 - root - DEBUG - Start.
2018-12-06 17:03:45,984 - root - DEBUG - Exit.
2018-12-06 17:03:45,984 - root - DEBUG - Exit.
2018-12-06 17:03:49,739 - root - DEBUG - Start.
2018-12-06 17:03:49,739 - root - DEBUG - Start.
2018-12-06 17:03:49,739 - root - DEBUG - Start.
2018-12-06 17:03:49,742 - root - DEBUG - Exit.
2018-12-06 17:03:49,742 - root - DEBUG - Exit.
2018-12-06 17:03:49,742 - root - DEBUG - Exit.

Перезапуск ядра IPython или охват нового экземпляра консоли сбрасывает это поведение.«Сброс переменных», кажется, не влияет на это, не так ли?

Я думаю, что новые экземпляры fileHandlers добавляются в объект 'logger' при каждом последующем запуске.Отметьте одну и ту же метку времени на каждой из дублирующихся записей журнала.

Есть идеи, как избежать / исправить это?

1 Ответ

0 голосов
/ 06 декабря 2018

Я думаю, что новый экземпляр 'fileHandler' добавляется к объекту 'logger' при каждом последующем запуске

Да, я думаю, что это правильно.Чтобы избежать этого, вы можете определить, если fh и ch уже определены, поэтому вы не переопределяете их и не добавляете их в logging при каждом запуске.

Для этого вы можете добавить кодкак это:

from IPython import get_ipython

if not 'fh' in get_ipython().user_ns:
    fh = logging.FileHandler('logfile')
    fh.setLevel(logging.DEBUG)
    ...

и то же самое для ch.

...