2016-07-20 12 views
3

Ich komme von SLF4J und Log4J, also könnte das der Grund sein, warum ich nicht verstehe, wie Logging in Python funktioniert.Protokollierung und Vererbung von Loggerkonfigurationen in Python

Ich habe folgendes

---- logging.yaml

version: 1 

handlers: 

    console: 
    class: logging.StreamHandler 
    level: DEBUG 
    stream: ext://sys.stderr 
    formatter: simpleFormatter 

    file: 
    class: logging.FileHandler 
    filename: app.log 
    mode: w 
    level: DEBUG 
    formatter: simpleFormatter 

formatters: 
    simpleFormatter: 
    #class: !!python/name:logging.Formatter 
    #class: logging.Formatter 
    format: '%(name)s %(asctime)s %(levelname)s %(message)s' 
    datefmt: '%d/%m/%Y %H:%M:%S' 


root: 
    level: INFO 
    handlers: [console, file] 

mod: 
    level: DEBUG 

----- mod.py

import logging 

def foo(): 
    log = logging.getLogger (__name__) 
    log.debug ('Hello from the module') 

---- main.py

from logging.config import dictConfig 
import yaml 
with open ('logging.yaml') as flog: 
    dictConfig (yaml.load (flog)) 

import logging 

from mod import foo 

if __name__ == '__main__': 

    log = logging.getLogger (__name__) 
    log.debug ('Hello from main') 

    foo() 

Mit der Konfiguration oben würde ich erwarten, nur zu sehen die Nachricht 'Hello from the module'. Stattdessen wird nichts gedruckt. Wenn ich DEBUG für den Stammlogger einstelle, werden beide Nachrichten gedruckt.

Also, werden die Nachrichten nicht an die oberen Logger weitergeleitet? Ist der mod Logger kein Kind von root? Akzeptiert der Logger mod nicht die Konfiguration handlers? (Ich habe versucht, handlers in mod zu wiederholen, aber nichts ändert sich).

Wie kann ich eine Konfiguration erreichen sagen: Standardebene ist INFO, das Niveau für dieses Modul und Untermodule ist DEBUG, alles an den Handler für root definiert geht?

+1

Ich werde nur hier setzen: https://www.python.org/dev/peps/pep-0008/ – jonrsharpe

Antwort

2

Sie haben einen ziemlich einfachen Fehler: zur Kenntnis, dass pro the docs, Konfiguration für Logger andere als root sollte unter dem loggers Schlüssel:

a dict in which each key is a logger name and each value is a dict describing how to configure the corresponding Logger instance

Hinzufügen diesen Schlüssel und Einrücken der entsprechenden Zeilen zu geben:

loggers: 
    mod: 
    level: DEBUG 

funktioniert wie erwartet:

$ python main.py 
mod 20/07/2016 14:35:32 DEBUG Hello from the module 

$ cat app.log 
mod 20/07/2016 14:35:32 DEBUG Hello from the module 
+0

Ich wusste, es war etwas albern! Dank Jon, eine Sache, die hinzugefügt werden muss, ist, dass Wurzel nicht unter Holzfällern gehen muss. – zakmck

+1

@zakmck ja: wieder, * "anders als root" *. – jonrsharpe

Verwandte Themen