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

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

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

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


person Kyle Brandt    schedule 13.09.2013    source источник
comment
Какую версию IPython вы используете, поскольку она работает в 1.0?   -  person Viktor Kerkez    schedule 13.09.2013
comment
@ViktorKerkez ipython3 notebook --version возвращает 1.0.0   -  person Kyle Brandt    schedule 13.09.2013
comment
imgur.com/1b7nGZz Я получаю это, когда пробую ваш код.   -  person Viktor Kerkez    schedule 13.09.2013
comment
@ViktorKerkez: Я этого не понимаю, думаю, мне следует подать вопрос ...   -  person Kyle Brandt    schedule 13.09.2013


Ответы (8)


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

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

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

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

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

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

person falsetru    schedule 15.09.2013
comment
То же самое происходит в обычной консоли IPython: она ничего не печатает, если не создан корень logger. - person Ioannis Filippidis; 21.01.2014
comment
Это решение снова работает в ipykernel 4.5 (возможно, уже в 4.4) github.com/jupyter/notebook/ issues / 1397 - person pylang; 15.11.2016
comment
Это больше не работает. Только не с Jupyter Notebook 5.3.0 - person Sam; 27.04.2018
comment
У меня работает со следующей установкой jupyter: `` $ jupyter --version jupyter core: 4.6.3 jupyter-notebook: не установлен qtconsole: не установлен ipython: 7.18.1 ipykernel: 5.3.4 jupyter client: 6.1.7 jupyter lab: не установлено nbconvert: не установлено ipywidgets: не установлено nbformat: не установлено traitlets: 5.0.5 '' - person Olshansk; 15.11.2020
comment
@Sam и другие, у меня также были проблемы с входом в сеансы jupyter notebooks и ipython. После вызова logging.basicConfig(stream=sys.stdout), насколько я могу судить, ведение журнала работает как обычно. Я нашел решение [здесь] (gist.github.com/wassname/d17325f36c36fa663dd7de3c09 - person Stefan; 10.02.2021
comment
Обратите внимание, что для того, чтобы изменения в logging.basicConfig вступили в силу, кажется, требуется перезапуск ядра ноутбука. - person cchwala; 21.04.2021

Если вы все еще хотите использовать 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')
person Marigold    schedule 31.01.2014
comment
Для тех, кто пытается сделать это в Python 3: reload теперь imp.reload - person kuzzooroo; 15.01.2015
comment
начиная с Python 3.5, вы должны использовать importlib.reload, поскольку модуль imp устарело. - person Webucator; 16.10.2015
comment
Если у кого-то возникли проблемы со Spyder с ведением журнала (когда все попытки изменить поведение регистратора были безуспешными), это только что закончило дневную погоню за гусиной. github.com/spyder-ide/spyder/issues/2572 Большое спасибо ! - person FrenchKheldar; 02.02.2018

Насколько я понимаю, сеанс 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, он запишет повторяющиеся записи в файл, поскольку теперь будут определены два обработчика файлов.

person skulz00    schedule 28.01.2015
comment
Чтобы это выглядело менее грубо, поместите код в модуль на своем пути Python и импортируйте его. Красивее и удобнее в будущем. - person alexis; 11.06.2016
comment
Или используйте logging.config.fileConfig ('logging.conf') и поместите туда все настройки. - person K.-Michael Aye; 28.12.2016

Имейте в виду, что 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!')
person Ataxias    schedule 09.12.2016

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

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

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

person mcsim    schedule 21.10.2018
comment
Да, это работает. Один должен запустить basicConfig() tp заставить его работать. - person Brandt; 08.11.2019

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

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

person Garvey    schedule 25.09.2017
comment
Добро пожаловать в StackOverflow и благодарим за помощь. Возможно, вы захотите улучшить свой ответ, добавив некоторые пояснения. - person Elias MP; 25.09.2017
comment
На самом деле это был для меня самый полезный ответ! - person IanS; 24.11.2017
comment
Вы можете добавить несколько строк с примером? Какой дескриптор регистратора следует вызывать для печати сообщений журнала? - person Sam; 27.04.2018
comment
По крайней мере, ipython 7.9.0 (или jupyter 6.0.2) игнорирует предлагаемый код, поскольку он не поддерживает этот класс из работающей консоли. Запустите %config, чтобы увидеть поддерживаемые классы, Application не входит в их число. ipython 7.9.0 здесь. - person stason; 11.02.2020

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

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")
person Brig    schedule 14.02.2019

Мне нужен был простой и понятный ответ на этот вопрос с красиво оформленным выводом, поэтому вот моя рекомендация.

import sys
import logging

logging.basicConfig(
    format='%(asctime)s [%(levelname)s] %(name)s - %(message)s',
    level=logging.INFO,
    datefmt='%Y-%m-%d %H:%M:%S',
    stream=sys.stdout,
)
log = logging.getLogger('notebook')

Затем вы можете использовать log.info() или любой из других уровней ведения журнала в любом месте вашего ноутбука с выводом, который выглядит следующим образом

2020-10-28 17:07:08 [INFO] notebook - Hello world
2020-10-28 17:12:22 [INFO] notebook - More info here
2020-10-28 17:12:22 [INFO] notebook - And some more
person yanniskatsaros    schedule 28.10.2020