Когда я запускаю следующий внутри IPython Notebook, я не вижу выхода:
import logging
logging.basicConfig(level=logging.DEBUG)
logging.debug("test")
Кто-нибудь знает, как это сделать, чтобы я мог увидеть сообщение "test" внутри ноутбука?
Когда я запускаю следующий внутри IPython Notebook, я не вижу выхода:
import logging
logging.basicConfig(level=logging.DEBUG)
logging.debug("test")
Кто-нибудь знает, как это сделать, чтобы я мог увидеть сообщение "test" внутри ноутбука?
Попробуйте следующее:
import logging
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
logging.debug("test")
Согласно logging.basicConfig:
Использует ли базовая конфигурация для системы регистрации, создавая StreamHandler со стандартным Formatter и добавлением его к корню регистратор. Функции debug(), info(), warning(), error() и critical() будет вызывать basicConfig() автоматически, если обработчики не будут для корневого регистратора.
Эта функция ничего не делает, если корневой регистратор уже имеет обработчики настроенный для него.
Кажется, что ipython-ноутбук вызывает basicConfig (или задает обработчик) где-то.
Если вы все еще хотите использовать 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')
Я понимаю, что сеанс 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, он будет записывать дубликаты записей в файл, так как теперь будут определены два обработчика файлов
Имейте в виду, что 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!')
Вы можете настроить ведение журнала, запустив %config Application.log_level="INFO"
Для получения дополнительной информации см. Параметры ядра IPython.
Что сработало для меня сейчас (Jupyter, сервер для ноутбуков: 5.4.1, IPython 7.0.1)
import logging
logging.basicConfig()
logger = logging.getLogger('Something')
logger.setLevel(logging.DEBUG)
Теперь я могу использовать logger для печати информации, в противном случае я буду видеть только сообщения с уровнем по умолчанию (logging.WARNING
) или выше.
Я установил регистратор для обоих файлов, и я хотел, чтобы он появился на ноутбуке. Оказывается, добавление обработчика файлов очищает обработчик потока по умолчанию.
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")