214 votes

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-il comment faire pour que je puisse voir le message "test" à l'intérieur du cahier ?

211voto

falsetru Points 109148

Essayez de suivre :

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

Selon logging.basicConfig :

Effectue une configuration de base pour le système de journalisation en créant un StreamHandler avec un Formater par défaut et en l'ajoutant au Root logger. Les fonctions debug(), info(), warning(), error() et critique() appelleront basicConfig() automatiquement si aucun gestionnaire n'est définis pour le collecteur racine.

Cette fonction ne fait rien si le collecteur racine a déjà des gestionnaires configurés pour lui.

Il semble que le cahier d'ipython appelle basicConfig (ou set handler) quelque part.

93voto

Marigold Points 1409

Si vous voulez toujours utiliser basicConfig Rechargez le module de journalisation comme suit

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

42voto

skulz00 Points 709

Si je comprends bien, la session IPython démarre la journalisation, donc basicConfig ne fonctionne pas. Voici la configuration qui fonctionne pour moi (j'aimerais que cela n'ait pas l'air si grossier car je veux l'utiliser pour presque tous mes ordinateurs portables) :

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.')

J'obtiens un fichier "mylog.log" dans le même répertoire que mon ordinateur portable qui contient :

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 commande sans redémarrer la session IPython, elle écrira des entrées en double dans le fichier puisqu'il y aura maintenant deux gestionnaires de fichiers définis.

32voto

Ataxias Points 311

Gardez à l'esprit que stderr est le flux par défaut de la fonction logging donc dans IPython et les carnets Jupyter, vous ne verrez peut-être rien à moins de configurer le flux vers stdout :

import logging
import sys

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

logging.info('Hello world!')

23voto

mcsim Points 685

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

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

Maintenant je peux utiliser le logger pour imprimer les informations, sinon je ne verrais que les messages du niveau par défaut ( logging.WARNING ) ou plus.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X