2016-04-01 5 views
0

Ich kann nicht verstehen, warum der folgende Code nicht meine Debug-Meldung erzeugen, obwohl wirksames Niveau angemessen ist (Ausgang ist nur 10)Python Protokolliergrade verhalten inkonsequent

import logging 

l = logging.getLogger() 
l.setLevel(logging.DEBUG) 
l.debug("Debug Mess!") 
l.error(l.getEffectiveLevel()) 

während, wenn ich diese Zeile nach der Import: logging.debug("Start...")

import logging 

logging.debug("Start...") 
l = logging.getLogger() 
l.setLevel(logging.DEBUG) 
l.debug("Debug Mess!") 
l.error(l.getEffectiveLevel()) 

es folgende Ausgabe erzeugt:

DEBUG:root:Debug Mess! 
ERROR:root:10 

also obwohl "Start ..." nicht angezeigt wird, beginnt es zu loggen. Warum?

Es ist auf Python 3.5. Danke

Antwort

2

Der oberste logging.debug(..) Aufruf ruft die logging.basicConfig() function für Sie auf, wenn noch keine Handler auf dem Root-Logger konfiguriert wurden.

Da ein Anruf an logging.getLogger().debug() funktioniert nicht diesen Aufruf auslösen, sehen Sie keine Ausgabe, da keine Handler die Ausgabe zu zeigen sind.

Der Python-3-Version von logger ein logging.lastResort handler hat, verwendet, wenn keine Protokollkonfiguration vorhanden ist, aber diese Prozedur, um nur Nachrichten von Level WARNING und bis konfiguriert ist, weshalb Sie Ihre ERROR Ebene Nachricht (10) sehen gedruckt auf STDERR, aber nicht Ihre DEBUG Ebene Nachricht. In Python 2 erhalten Sie die Nachricht Keine Handler gefunden werden konnte für Logger "root" stattdessen gedruckt, nur einmal für den ersten Versuch, alles zu protokollieren. Ich würde mich jedoch nicht auf den Handler lastResort verlassen; Konfigurieren Sie stattdessen ordnungsgemäß Ihre Protokollierungshierarchie mit einem anständigen Handler, der für Ihre eigenen Anforderungen konfiguriert ist.

nennen Entweder logging.basicConfig() selbst, oder manuell einen Handler auf dem Root-Logger hinzu:

l = logging.getLogger() 
l.addHandler(logging.StreamHandler()) 

Die oben im Grunde macht das Gleiche wie ein logging.basicConfig() Anruf ohne weitere Argumente. Die auf diese Weise erstellte StreamHandler() protokolliert STDERR und filtert nicht weiter auf Nachrichtenebene. Beachten Sie, dass ein Anruf logging.basicConfig() den Protokolliergrad für Sie auch festlegen kann.

+0

was ist die beste Praxis die Protokollebene von dem Anrufer noch in der Lage zu erben, das Modul haben Unittest mit Protokollen withing? –

0

Der Root-Logger (default Logger, obersten Ebene) und alle Standard-Protokollebene des anderen Logger warning (Bestellung 3) in allen Ebenen 5 log: debug < info < warning < error < fatal um.

Also bei deinem ersten logging.debug('starting...'), Sie haben nicht festgelegt die Root-Protokollebene auf debug als Code folgenden und Sie können die starting... Ausgabe nicht erhalten.

import logging 
logging.basicConfig(level=logging.DEBUG) 
logging.debug('starting...') 

see python logging HOW TO for detail