Отримайте вихід із модуля реєстрації даних у ноутбуці IPython


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: Я не розумію, що я мушу подати проблему ...
Kyle Brandt

Відповіді:


130

Спробуйте наступне:

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

За даними logging.basicConfig :

Чи є основна конфігурація для системи журналу, створивши StreamHandler із форматником за замовчуванням та додавши його до кореневого журналу. Функції налагодження (), інформація (), попередження (), помилка () та критичний () автоматично викликають basicConfig (), якщо для кореневого реєстратора не визначено обробників.

Ця функція не робить нічого, якщо кореневий реєстратор вже має для цього налаштовані обробники.

Здається, десь дзвінок ipython викликає basicConfig (або встановлений обробник) десь.


4
Те саме відбувається в звичайній консолі IPython: вона нічого не друкує, якщо тільки не створено корінь logger.
Іоанніс Філіппідіс

1
Це рішення знову працює в ipykernel4,5 (можливо, вже до 4,4) github.com/jupyter/notebook/isissue/1397
pylang

17
Це вже не працює. Не з ноутбуком Юпітера 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, коли модуль імпуляції застарілий.
Webucator

2
Якщо у когось проблеми зі шпидером із веденням журналу (де всі спроби змінити поведінку реєстратора були невдалими), це просто закінчилося цілоденною погоні гусей. github.com/spyder-ide/spyder/isissue/2572 Дякую велике!
Французькийгельдар

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


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) або вище.


2
Так, це працює. Один повинен бігти basicConfig()тп зробити його роботу.
Брандт

11

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

Для отримання додаткової інформації див. Параметри ядра IPython


1
Ласкаво просимо до StackOverflow і дякуємо за вашу допомогу. Ви можете зробити свою відповідь ще кращою, додавши пояснення.
Еліас МП

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 6.0.2):

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

DEBUG:root:test message
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.