Obter saída do módulo de registro no IPython Notebook


127

Quando executo o seguinte no IPython Notebook, não vejo saída:

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

Alguém sabe como fazer isso para que eu possa ver a mensagem "teste" dentro do notebook?


Qual versão do IPython você está usando, pois isso funciona na versão 1.0?
Viktor Kerkez

@ViktorKerkez ipython3 notebook --versionretorna1.0.0
Kyle Brandt

imgur.com/1b7nGZz Recebo isso quando tento seu código.
Viktor Kerkez 13/09

@ViktorKerkez: Ya eu não conseguir isso, acho que eu deveria apresentar um problema ...
Kyle Brandt

Respostas:


129

Tente o seguinte:

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

De acordo com logging.basicConfig :

Faz a configuração básica do sistema de criação de log criando um StreamHandler com um Formatador padrão e adicionando-o ao criador de logs raiz. As funções debug (), info (), warning (), error () e critical () chamarão basicConfig () automaticamente se nenhum manipulador estiver definido para o registrador raiz.

Essa função não faz nada se o registrador raiz já tiver manipuladores configurados para ela.

Parece que o notebook ipython chama o basicConfig (ou o manipulador de conjunto) em algum lugar.


4
O mesmo ocorre em um console IPython normal: ele não imprime nada, a menos que uma raiz loggerseja criada.
Ioannis Filippidis

1
Essa solução funciona novamente no ipykernel4.5 (possivelmente no 4.4) github.com/jupyter/notebook/issues/1397
pylang 15/16

17
Isso não funciona mais. Não com o Jupyter Notebook 5.3.0
Wesam

64

Se você ainda deseja usar basicConfig, recarregue o módulo de registro como este

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
Para qualquer um que tenta fazer isso em Python 3: reloadé agoraimp.reload
kuzzooroo

11
a partir do Python 3.5, você deve usar importlib.reload, pois o módulo imp está sendo preterido.
Webucator 16/10/2015

2
Se alguém está tendo problemas com o Spyder com o registro (onde todas as tentativas de modificar o comportamento do criador de logs não tiveram êxito), isso acabou com uma perseguição de ganso de um dia. github.com/spyder-ide/spyder/issues/2572 Muito obrigado!
Febre

27

Meu entendimento é que a sessão do IPython inicia o log para que o basicConfig não funcione. Aqui está a configuração que funciona para mim (eu gostaria que isso não fosse tão grosseiro, pois eu quero usá-lo em quase todos os meus notebooks):

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)

Agora, quando eu corro:

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

Eu recebo um arquivo "mylog.log" no mesmo diretório do meu notebook que contém:

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.

Observe que, se você executar novamente isso sem reiniciar a sessão do IPython, ele gravará entradas duplicadas no arquivo, pois agora haverá dois manipuladores de arquivos definidos


3
Para tornar isso menos "bruto", coloque o código em um módulo no seu caminho python e importe-o. Mais bonito e fácil de atualizar no futuro.
11116 Alexis

1
Ou use logging.config.fileConfig ('logging.conf') e coloque toda a configuração lá.
K.-Michael Aye

14

Lembre-se de que stderr é o fluxo padrão do loggingmódulo; portanto, nos blocos de anotações IPython e Jupyter, talvez você não veja nada, a menos que configure o fluxo para 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

O que funcionou para mim agora (Jupyter, servidor de notebook é: 5.4.1, IPython 7.0.1)

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

Agora eu posso usar o logger para imprimir informações, caso contrário, veria apenas uma mensagem do nível padrão ( logging.WARNING) ou superior.


2
Sim, isso funciona. Um tem para executar basicConfig()tp torná-lo trabalho.
Brandt

11

Você pode configurar o log executando %config Application.log_level="INFO"

Para obter mais informações, consulte Opções do kernel do IPython


1
Bem-vindo ao StackOverflow e obrigado por sua ajuda. Você pode melhorar ainda mais sua resposta adicionando alguma explicação.
Elias MP

1
Esta foi realmente a resposta mais útil para mim!
IANS

1
Você pode adicionar algumas linhas com um exemplo? Qual é o identificador do criador de logs para invocar para imprimir mensagens de log?
Wesam

Pelo menos o ipython 7.9.0 (ou jupyter 6.0.2) ignora o código sugerido, pois não suporta esta classe no console em execução. Corra %configpara ver os classificados classificados, Applicationnão é um deles. ipython 7.9.0 aqui.
stason 11/02

4

Eu configurei um logger para os dois arquivos e queria que ele aparecesse no notebook. Acontece que adicionar um manipulador de arquivos limpa o handolder de fluxo padrão.

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

Parece que as soluções que funcionavam para versões mais antigas do ipython / jupyter não funcionam mais.

Aqui está uma solução funcional para o ipython 7.9.0 (também testada com o jupyter server 6.0.2):

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

DEBUG:root:test message
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.