2013-07-08 11 views
10

Ich möchte StreamHandler Logging-Handler von Python verwenden. Was ich versucht habe, ist,Python: logging.streamhandler sendet keine Protokolle an stdout

import logging 
import sys 
mylogger = logging.getLogger("mylogger") 
h1 = logging.StreamHandler(stream=sys.stdout) 
h1.setLevel(logging.DEBUG) 

mylogger.addHandler(h1) 

# now trying to log with the created logger 
mylogger.debug("abcd") # <no output> 
mylogger.info("abcd") # <no output> 
mylogger.warn("abcd") # abcd 

ich etwas fehle? Oder etwas falsch machen? Warum INFO und DEBUG-Level-Logs nicht auf STDOUT kommen?

Antwort

16

Sie haben das Niveau des Loggers zu setzen, nicht nur das Niveau des Handlers:

mylogger.setLevel(logging.DEBUG) 

Hier ist eine schöne Grafik des Logging-Workflow, in dem Sie, dass entweder der Logger und der Handler sehen überprüfen Sie die Protokollebene:

http://docs.python.org/2/howto/logging.html#logging-flow

der Standard logLevel ist WARNING, also auch wenn Sie die Höhe Ihres Handler DEBUG gesetzt ist, wird die Nachricht nicht erhalten durch, da Ihr Logger es unterdrückt (es ist auch standardmäßig WARNING).

By the way, können Sie mit Formatter einige grundlegende Formatierungen tun:

import logging 
import sys 

mylogger = logging.getLogger("mylogger") 

formatter = logging.Formatter('[%(levelname)s] %(message)s') 

handler = logging.StreamHandler(stream=sys.stdout) 
handler.setFormatter(formatter) 
handler.setLevel(logging.DEBUG) 

mylogger.addHandler(handler) 
mylogger.setLevel(logging.DEBUG) 

mylogger.debug("This is a debug message.") 
mylogger.info("Some info message.") 
mylogger.warning("A warning.") 

geben Ihnen die Ausgabe

[DEBUG] This is a debug message. 
[INFO] Some info message. 
[WARNING] A warning. 
+0

ich einige grundlegende Dokumente, http folgenden wurde: //docs.python. org/2/howto/logging.html # logging-advanced-tutorial Doc sagt setLevel on handler. Ist dieses Dokument falsch? –

+2

Nein, es ist nicht falsch, wie Sie in http://docs.python.org/2/howto/logging.html#logging-flow sehen können, übergibt der Logger den Protokollierungsaufruf an seinen Handler, nachdem er den Level überprüft hat. Wenn also der Pegel des Loggers auf "WARN" gesetzt ist und eine "DEBUG" -Nachricht ankommt, wird nichts durchgereicht. Wenn eine Nachricht übergeben wird, übergibt der Logger sie an den Handler, der ebenfalls über einen Protokollierungstyp "Filter" verfügt. – tamasgal

+0

Warum muss ich den Logger-Level einstellen, wenn ich den Level des Handlers eingestellt habe? Warum zweimal einstellen? das scheint überflüssig zu sein. – ospider

Verwandte Themen