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

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

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

Кто-нибудь знает, как это сделать, чтобы я мог увидеть сообщение "test" внутри ноутбука?

Ответ 1

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

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

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

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

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

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

Ответ 2

Если вы все еще хотите использовать 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')

Ответ 3

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

Ответ 4

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

Ответ 5

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

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

Ответ 6

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

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

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

Ответ 7

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

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")