Модуль логирования не печатает в IPython

Следующий код печатает "Я хочу это напечатать" в "ipython qtconsole", однако он не печатает на обычном IPython.

import logging
import logging.handlers

log = logging.getLogger()
f = logging.Formatter("%(asctime)s - %(module)s.   %(funcName)s - %(levelname)s - %(message)s")
fh = logging.handlers.TimedRotatingFileHandler('log.txt', 'W6')
fh.setFormatter(f)
log.addHandler(fh)
log.setLevel(logging.INFO)
log.info('I want this to print')

В "IPython qtconsole", однако, я получаю разные проблемы, которые я пытался объяснить здесь (что не получилось так хорошо, читать не нужно!).

Подскажите, пожалуйста, почему?

РЕДАКТИРОВАТЬ: я использую Python 2.7

EDIT2: Может быть, мне действительно нужно добавить logging.StreamHandler.

3 ответа

Решение

Это похоже на qtconsole добавляет обработчик к root регистратор:

In [1]: import logging
   ...: root = logging.getLogger()
   ...: root.handlers
   ...: 
Out[1]: [<logging.StreamHandler at 0x7fd8e00e1f98>]

При использовании обычного интерпретатора Python или просто ipython:

In [1]: import logging

In [2]: root = logging.getLogger()

In [3]: root.handlers
Out[3]: []

Если вы хотите, чтобы оба вели себя одинаково, вы должны либо добавить StreamHandler к корневому логгеру для нормального ipythonили удалите StreamHandler из интерпретатора qtconsole.

Если вы хотите первое, просто добавьте:

root = logging.getLogger()
root.addHandler(logging.StreamHandler())

Если вы хотите последнее, прежде чем добавлять свой собственный обработчик, выполните:

for handler in root.handlers[:]:
    root.removeHandler(handler)

Обратите внимание, что IPython уже предоставляет некоторый механизм для записи в файл. Смотрите документацию. Если вы хотите использовать код только внутри ipython, использовать его магию может быть проще.

Что сработало для меня

импортировать регистратор ДО любой другой библиотеки / кода, в отдельной ячейке. это на самом деле главное требование. Если я загружаю ведение журнала и другие библиотеки в одну ячейку, независимо от того, какая иерархия в этой ячейке, ведение журнала не работает

import logging
reload(logging)
logger = logging.getLogger(__name__)

только после загрузки библиотек я настраиваю logging config, чтобы избежать распечатки pyspark load debug

logging.basicConfig(format='%(asctime)s %(levelname)s:%(message)s', 
                    level=logging.INFO, 
                    datefmt='%I:%M:%S')

Если вы используете последнее решение Bakuriu, оно не будет работать должным образом, если root имеет более одного обработчика из-за проблем, возникающих во время итерации.

Используйте вместо:

while len(root.handlers):
    root.removeHandler(root.handlers[0])
Другие вопросы по тегам