2017-12-21 3 views
0

Exposition:Warum Pythons Logging-Paket einige Ebenen ignoriert?

das Logging-Modul in einem 3.6.3 Python dort verwenden sind einige falsch verstanden Fragen. Zuerst erstelle ich 2 Logs mit der Standardkonfiguration, ohne einen Namen und level = 30, die logging.WARNING ist.

Wie die Dokumente sagten, kam das Log-Objekt ohne Handler, ich ändere den Loglevel auf 10 (logging.DEBUG) und wenn ich mit INFO drucken werde (was level = 20 ist), wobei in Level 10 (unter Infoebene) die Informationen nicht protokolliert, und schließlich hat das Protokoll keine Handler nicht bekommen, aber der doc von https://docs.python.org/3/library/logging.html?highlight=logging#module-logging sagt:

logging.basicConfig (** kwargs) ¶ :

Führt die Basiskonfiguration für das Protokollierungssystem durch, indem ein StreamHandler mit einem Standardformatter erstellt und zum Stammverzeichnis 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.

Also, meine Fragen sind, was ich falsch mache? Warum wird das verursacht? Kann ich das Protokoll nicht instanziieren, level für root als log.setLevel (logging.INFO) setzen und log.info ("poo") machen, wie ich es bis zu diesem Problem getan habe ?.

Code:

Python 3.6.3 (default, Oct 31 2017, 11:19:55)      
Type 'copyright', 'credits' or 'license' for more information  
IPython 6.2.1 -- An enhanced Interactive Python. Type '?' for help. 

In [1]: import logging            

In [2]: log1 = logging.getLogger()         

In [3]: log2 = logging.getLogger()         

In [4]: log1.level             
Out[4]: 30               

In [5]: log1.hasHandlers()           
Out[5]: False              

In [6]: log1.setLevel(10) ## logging.DEBUG == 10      

In [7]: log1               
Out[7]: <RootLogger root (DEBUG)>         

In [8]: log2               
Out[8]: <RootLogger root (DEBUG)>         

In [9]: log1.info("asdad")           

In [10]: log2.info("asdad")           

In [11]: log1.hasHandlers()           
Out[11]: False              

In [12]: logging.basicConfig(level=20) # logging.INFO == 20   

In [13]: log2              
Out[13]: <RootLogger root (INFO)>         

In [14]: log2.info("ASDADA")           
INFO:root:ASDADA              

In [15]: log1.hasHandlers()           
Out[15]: True              

In [16]: log1.handlers == log2.handlers        
Out[16]: True              

In [17]: logging.basicConfig(level=10) # logging.DEBUG == 10   

In [18]: log2.info("ASDADA")           
INFO:root:ASDADA              

In [19]: log1              
Out[19]: <RootLogger root (INFO)>         

In [20]: log2              
Out[20]: <RootLogger root (INFO)>         

In [21]: log1.level             
Out[21]: 20 

AKTUALISIERT: 1

In [1]: import logging 

In [2]: logging.getLogger().hasHandlers() 
Out[2]: False 

In [3]: logging.getLogger().level 
Out[3]: 30 

In [4]: logging.getLogger().info("papa") 

In [5]: logging.getLogger().hasHandlers() 
Out[5]: False 

In [6]: logging.info("foo") 

In [7]: logging.getLogger().hasHandlers() 
Out[7]: True 

AKTUALISIERT: 2

In [2]: import logging 

In [3]: log = logging.getLogger() 

In [4]: log.info("poo") 

In [5]: log.warning("poo") 
poo 

In [6]: log.setLevel(logging.INFO) 

In [7]: log.info("poo") 

Antwort

1

Ich denke, die zitierte documenta ist nicht klar genug. Wenn Sie auf die aufgelisteten Funktionen auf der Dokumentwebseite klicken, werden sie mit Funktionen wie logging.info() verknüpft. Sie haben stattdessen Logger-Objektmethoden mit denselben Namen verwendet.

>>> import logging 
>>> logging.getLogger().hasHandlers() 
False 
>>> logging.warning("TEST") 
WARNING:root:TEST 
>>> logging.getLogger().hasHandlers() 
True 
+0

Standardmäßig ist die Root-Ebene logging.WARNING (30) so alles mit gleicher oder größerer Ebene wird wie in gedruckt werden ** UPDATE: 1 ** Aber was ich frage, ist, dass, wenn ich Ändern Sie die Ebene auf eine kleinere Ebene als das Logging.WARNING, wenn es keine vorherige basicConfig gibt, funktioniert die setLevel-Methode nicht mit Logger-Objekten. Ich sehe, dass wie in der ** UPDATE: 2 **, Logging.info -Methode funktioniert, aber was ich will ist eine Reihe von Loggern mit dem gleichen Namen, die ihre Konfiguration teilt, aber wenn ich mit Logger arbeite Objekte die Situation ist dies: – PurpleZooL

+0

@PurpleZooL Ich fürchte, ich verstehe Ihren Kommentar nicht vollständig. In Ihrer Frage gibt es nun viele Codezeilen, die sich wie erwartet anders verhalten. – VPfB

+0

@PurpleZooL Du sagst "was ich will ist ein Haufen Logger mit dem gleichen Namen". Das macht keinen Sinn, denn Logger sind Singletons. Sie können nicht mehrere Logger mit 'logging.getLogger (name)' erstellen, da Sie für einen gegebenen Namen immer dieselbe 'Logger'-Instanz von 'getLogger()' zurückbekommen. –

Verwandte Themen