Ausgabe vom Protokollierungsmodul in IPython Notebook abrufen

127

Wenn ich in IPython Notebook Folgendes ausführe, wird keine Ausgabe angezeigt:

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

Weiß jemand, wie man es macht, damit ich die "Test" -Nachricht im Notizbuch sehen kann?

Kyle Brandt
quelle
Welche IPython-Version verwenden Sie, da dies in 1.0 funktioniert?
Viktor Kerkez
@ VictorKerkez ipython3 notebook --versionkehrt zurück1.0.0
Kyle Brandt
imgur.com/1b7nGZz Ich bekomme das, wenn ich Ihren Code versuche.
Viktor Kerkez
@ VictorKerkez: Ja, das verstehe ich nicht, ich denke, ich sollte ein Problem einreichen ...
Kyle Brandt

Antworten:

129

Versuchen Sie Folgendes:

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

Laut logging.basicConfig :

Führt die Grundkonfiguration für das Protokollierungssystem durch, indem ein StreamHandler mit einem Standardformatierer erstellt und dem Root-Logger hinzugefügt wird. Die Funktionen debug (), info (), warning (), error () und Critical () rufen basicConfig () automatisch auf, wenn für den Root-Logger keine Handler definiert sind.

Diese Funktion führt nichts aus, wenn für den Root-Logger bereits Handler konfiguriert sind.

Es scheint, als würde ein Ipython-Notebook irgendwo basicConfig (oder Set-Handler) aufrufen.

falsetru
quelle
4
Das gleiche gilt für eine normale IPython-Konsole: Sie druckt nichts, es sei denn, ein Root loggerwird erstellt.
Ioannis Filippidis
1
Diese Lösung funktioniert wieder in ipykernel4.5 (möglicherweise bereits in 4.4) github.com/jupyter/notebook/issues/1397
Pylang
17
Das funktioniert nicht mehr. Nicht mit dem Jupyter Notebook 5.3.0
Wesam
64

Wenn Sie es weiterhin verwenden möchten basicConfig, laden Sie das Protokollierungsmodul wie folgt neu

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')
Ringelblume
quelle
16
Für alle, die dies in Python 3 versuchen: reloadist jetztimp.reload
kuzzooroo
11
Ab Python 3.5 sollten Sie importlib.reload verwenden, da das imp-Modul veraltet ist.
Webucator
2
Wenn jemand Probleme mit Spyder bei der Protokollierung hat (bei denen alle Versuche, das Verhalten des Protokollierers zu ändern, erfolglos waren), endete damit eine tagelange Gänsejagd. github.com/spyder-ide/spyder/issues/2572 Vielen Dank!
FrenchKheldar
27

Ich verstehe, dass die IPython-Sitzung mit der Protokollierung beginnt, sodass basicConfig nicht funktioniert. Hier ist das Setup, das für mich funktioniert (ich wünschte, dies würde nicht so grob aussehen, da ich es für fast alle meine Notebooks verwenden möchte):

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)

Jetzt, wenn ich renne:

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

Ich erhalte eine "mylog.log" -Datei im selben Verzeichnis wie mein Notizbuch, die Folgendes enthält:

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.

Beachten Sie, dass beim erneuten Ausführen ohne Neustart der IPython-Sitzung doppelte Einträge in die Datei geschrieben werden, da jetzt zwei Dateihandler definiert sind

skulz00
quelle
3
Fügen Sie den Code in ein Modul auf Ihrem Python-Pfad ein und importieren Sie ihn, damit er weniger "grob aussieht". Hübscher und in Zukunft einfach zu aktualisieren.
Alexis
1
Oder verwenden Sie logging.config.fileConfig ('logging.conf') und fügen Sie alle Einstellungen dort ein.
K.-Michael Aye
14

Beachten Sie, dass stderr der Standard-Stream für das loggingModul ist. In IPython- und Jupyter-Notebooks wird möglicherweise nichts angezeigt , es sei denn, Sie konfigurieren den Stream für stdout:

import logging
import sys

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

logging.info('Hello world!')
Ataxien
quelle
13

Was jetzt für mich funktioniert hat (Jupyter, Notebook-Server ist: 5.4.1, IPython 7.0.1)

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

Jetzt kann ich Logger zum Drucken von Informationen verwenden, andernfalls würde nur eine Nachricht von der Standardebene ( logging.WARNING) oder höher angezeigt .

mcsim
quelle
2
Ja das funktioniert Man muss laufen, basicConfig()damit es funktioniert.
Brandt
11

Sie können die Protokollierung konfigurieren, indem Sie ausführen %config Application.log_level="INFO"

Weitere Informationen finden Sie unter IPython-Kerneloptionen

Garvey
quelle
1
Willkommen bei StackOverflow und vielen Dank für Ihre Hilfe. Vielleicht möchten Sie Ihre Antwort noch besser machen, indem Sie eine Erklärung hinzufügen.
Elias MP
1
Dies war tatsächlich die nützlichste Antwort für mich!
IanS
1
Können Sie ein paar Zeilen mit einem Beispiel hinzufügen? Was ist das Logger-Handle, das zum Drucken von Protokollnachrichten aufgerufen werden soll?
Wesam
Zumindest ipython 7.9.0 (oder jupyter 6.0.2) ignoriert den vorgeschlagenen Code, da diese Klasse von der laufenden Konsole nicht unterstützt wird. Ausführen %config, um die unterstützte Klasse zu sehen, Applicationist keine davon. ipython 7.9.0 hier.
Stason
4

Ich habe einen Logger für beide Dateien eingerichtet und wollte, dass er auf dem Notebook angezeigt wird. Es stellt sich heraus, dass durch Hinzufügen eines Dateihandlers der Standard-Stream-Handlder gelöscht wird.

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")
Brigg
quelle
0

Es scheint, dass Lösungen, die für ältere Versionen von ipython / jupyter funktionierten, nicht mehr funktionieren.

Hier ist eine funktionierende Lösung für ipython 7.9.0 (auch mit jupyter server 6.0.2 getestet):

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

DEBUG:root:test message
Stason
quelle