Получение вывода из модуля регистрации в IPython Notebook

128

Когда я запускаю следующее внутри IPython Notebook, я не вижу вывода:

import logging
logging.basicConfig(level=logging.DEBUG)
logging.debug("test")

Кто-нибудь знает, как сделать так, чтобы я видел "тестовое" сообщение внутри записной книжки?

Кайл Брандт
источник
Какую версию IPython вы используете, поскольку она работает в 1.0?
Виктор Керкез,
@ViktorKerkez ipython3 notebook --versionвозвращается1.0.0
Кайл Брандт
imgur.com/1b7nGZz Я получаю это, когда пробую ваш код.
Виктор Керкез,
@ViktorKerkez: Да, я этого не понимаю, думаю, мне следует подать вопрос ...
Кайл Брандт,

Ответы:

130

Попробуйте следующее:

import logging
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
logging.debug("test")

Согласно logging.basicConfig :

Выполняет базовую настройку системы ведения журнала, создав StreamHandler со стандартным Formatter и добавив его в корневой регистратор. Функции debug (), info (), warning (), error () и critical () будут вызывать basicConfig () автоматически, если для корневого регистратора не определены обработчики.

Эта функция ничего не делает, если для корневого регистратора уже настроены обработчики.

Похоже, что ipython notebook вызывает basicConfig (или устанавливает обработчик) где-то.

falsetru
источник
4
То же самое происходит в обычной консоли IPython: она ничего не печатает, если не создается корень logger.
Иоаннис Филиппидис
1
Это решение снова работает в ipykernel
версии
18
Это больше не работает. Только не с Jupyter Notebook 5.3.0
Весам
65

Если вы все еще хотите использовать basicConfig, перезагрузите модуль ведения журнала, как это

from importlib import reload  # Not needed in Python 2
import logging
reload(logging)
logging.basicConfig(format='%(asctime)s %(levelname)s:%(message)s', level=logging.DEBUG, datefmt='%I:%M:%S')
ноготки
источник
16
Для всех, кто пытается сделать это в Python 3: reloadсейчасimp.reload
kuzzooroo
11
начиная с Python 3.5, вы должны использовать importlib.reload, поскольку модуль imp устарел.
Webucator
2
Если у кого-то возникли проблемы со Spyder с ведением журнала (когда все попытки изменить поведение регистратора были безуспешными), это только что закончило дневную погоню за гусиной. github.com/spyder-ide/spyder/issues/2572 Большое спасибо!
FrenchKheldar 02
28

Насколько я понимаю, сеанс IPython запускает ведение журнала, поэтому basicConfig не работает. Вот установка, которая мне подходит (хотелось бы, чтобы она не выглядела так грубо, поскольку я хочу использовать ее почти для всех своих ноутбуков):

import logging
logger = logging.getLogger()
fhandler = logging.FileHandler(filename='mylog.log', mode='a')
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fhandler.setFormatter(formatter)
logger.addHandler(fhandler)
logger.setLevel(logging.DEBUG)

Теперь, когда я бегу:

logging.error('hello!')
logging.debug('This is a debug message')
logging.info('this is an info message')
logging.warning('tbllalfhldfhd, warning.')

Я получаю файл mylog.log в том же каталоге, что и моя записная книжка, который содержит:

2015-01-28 09:49:25,026 - root - ERROR - hello!
2015-01-28 09:49:25,028 - root - DEBUG - This is a debug message
2015-01-28 09:49:25,029 - root - INFO - this is an info message
2015-01-28 09:49:25,032 - root - WARNING - tbllalfhldfhd, warning.

Обратите внимание, что если вы перезапустите это без перезапуска сеанса IPython, он запишет повторяющиеся записи в файл, поскольку теперь будут определены два обработчика файлов.

skulz00
источник
3
Чтобы сделать это менее «грубым», поместите код в модуль на своем пути к Python и импортируйте его. Красивее и проще в будущем.
Alexis
1
Или используйте logging.config.fileConfig ('logging.conf') и поместите туда все настройки.
К.-Майкл Айе
14

Имейте в виду, что stderr является потоком по умолчанию для loggingмодуля, поэтому в записных книжках IPython и Jupyter вы можете ничего не увидеть, если не настроите поток на stdout:

import logging
import sys

logging.basicConfig(format='%(asctime)s | %(levelname)s : %(message)s',
                     level=logging.INFO, stream=sys.stdout)

logging.info('Hello world!')
атаксии
источник
13

Что сработало для меня сейчас (Jupyter, сервер ноутбука: 5.4.1, IPython 7.0.1)

import logging
logging.basicConfig()
logger = logging.getLogger('Something')
logger.setLevel(logging.DEBUG)

Теперь я могу использовать регистратор для печати информации, иначе я бы видел только сообщение с уровнем по умолчанию ( logging.WARNING) или выше.

McSim
источник
2
Да, это работает. Один должен бежать basicConfig()тп сделать его работу.
Brandt
11

Вы можете настроить ведение журнала, запустив %config Application.log_level="INFO"

Для получения дополнительной информации см. Параметры ядра IPython.

Гарви
источник
1
Добро пожаловать в StackOverflow и благодарим за помощь. Возможно, вы захотите улучшить свой ответ, добавив некоторые пояснения.
Elias MP
1
На самом деле это был для меня самый полезный ответ!
IanS
1
Вы можете добавить несколько строк с примером? Какой дескриптор регистратора следует вызывать для печати сообщений журнала?
Весам
По крайней мере, ipython 7.9.0 (или jupyter 6.0.2) игнорирует предлагаемый код, поскольку он не поддерживает этот класс из работающей консоли. Беги, %configчтобы увидеть поддерживаемые классы, Applicationне из их числа. ipython 7.9.0 здесь.
Стасон
4

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

logger = logging.getLogger()

formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

# Setup file handler
fhandler  = logging.FileHandler('my.log')
fhandler.setLevel(logging.DEBUG)
fhandler.setFormatter(formatter)

# Configure stream handler for the cells
chandler = logging.StreamHandler()
chandler.setLevel(logging.DEBUG)
chandler.setFormatter(formatter)

# Add both handlers
logger.addHandler(fhandler)
logger.addHandler(chandler)
logger.setLevel(logging.DEBUG)

# Show the handlers
logger.handlers

# Log Something
logger.info("Test info")
logger.debug("Test debug")
logger.error("Test error")
Бриг
источник
0

Похоже, что решения, которые работали для более старых версий ipython / jupyter, больше не работают.

Вот рабочее решение для ipython 7.9.0 (также протестировано с jupyter server 6.0.2):

import logging
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
logging.debug("test message")

DEBUG:root:test message
Stason
источник