web-dev-qa-db-fra.com

Obtenir la sortie du module de journalisation dans IPython Notebook

Lorsque j'exécute ce qui suit dans IPython Notebook, je ne vois aucune sortie:

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

Quelqu'un sait comment le faire pour que je puisse voir le message "test" dans le cahier?

95
Kyle Brandt

Essayez de suivre:

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

Selon logging.basicConfig :

Effectue la configuration de base du système de journalisation en créant un fichier StreamHandler avec un formateur par défaut et l'ajoutant à la racine enregistreur. Les fonctions debug (), info (), warning (), error () et critical () appellera basicConfig () automatiquement si aucun gestionnaire n'est défini pour le logger racine.

Cette fonction ne fait rien si le logger racine a déjà des gestionnaires configuré pour cela.

Il semble que le portable ipython appelle basicConfig (ou le gestionnaire de jeux) quelque part.

87
falsetru

Si vous voulez toujours utiliser basicConfig, rechargez le module de journalisation comme ceci

import logging
reload(logging)
logging.basicConfig(format='%(asctime)s %(levelname)s:%(message)s', level=logging.DEBUG, datefmt='%I:%M:%S')
53
Marigold

Si j'ai bien compris, la session IPython démarre la journalisation afin que basicConfig ne fonctionne pas. Voici la configuration qui fonctionne pour moi (j'aimerais que ce ne soit pas aussi grossier, car je veux l'utiliser pour presque tous mes cahiers):

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)

Maintenant quand je cours:

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

Je reçois un fichier "mylog.log" dans le même répertoire que mon cahier contenant:

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.

Notez que si vous réexécutez cette opération sans redémarrer la session IPython, des entrées en double seront écrites dans le fichier car il y aurait maintenant deux gestionnaires de fichiers définis.

22
skulz00

Gardez à l'esprit que stderr est le flux par défaut du module logging. Par conséquent, dans les blocs-notes IPython et Jupyter, il est possible que rien ne soit visible à moins de configurer le flux sur stdout:

import logging
import sys

logging.basicConfig(format='%(asctime)s | %(levelname)s : %(message)s',
                     level=logging.INFO, stream=sys.stdout)

logging.info('Hello world!')
8
Ataxias

Vous pouvez configurer la journalisation en exécutant %config Application.log_level="INFO"

Pour plus d'informations, voir Options du noyau IPython

7
Garvey

Ce qui a fonctionné pour moi maintenant (Jupyter, serveur de cahiers est: 5.4.1, IPython 7.0.1)

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

Maintenant, je peux utiliser l'enregistreur pour imprimer les informations, sinon je ne verrais que les messages du niveau par défaut (logging.WARNING) ou supérieur.

1
mcsim

J'ai installé un enregistreur pour les deux fichiers et je voulais qu'il apparaisse sur le cahier. L’ajout d’un gestionnaire de fichiers efface le gestionnaire de flux par défaut.

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
Brig