2010-11-10 10 views
20

Da qualche parte nelle viscere del mio codice ho qualcosa di simile:gerarchia di registrazione vs root logger?

logger = logging.getLogger('debug0.x') 

Il modo in cui ho capito, questo dovrebbe solo rispondere quando ho fatto in precedenza qualcosa come:

logging.basicConfig(filename='10Nov2010a.txt',level=logging.DEBUG, name='debug0') 

nota che nome è stato definito come debug0. Tuttavia, ho scoperto che se fare

logging.basicConfig(filename='10Nov2010a.txt',level=logging.DEBUG) 

senza il nome parola chiave , quindi il registratore debug0.x definito sopra reagisce, e scrive nel file di registro. Pensavo che avrebbe reagito solo nel primo caso, quando il logger era stato nominato.

Sono confuso.

+3

['logging.basicConfig()'] (http://docs.python.org/library/logging.html#logging.basicConfig) non ha argomenti di parole chiave 'name'. –

risposta

52

Il modulo Python logging organizza logger in una gerarchia. Tutti i logger sono discendenti del logger root. Ogni registratore inoltra i messaggi di registro al suo genitore.

I nuovi logger vengono creati con la funzione . La funzione chiama logging.getLogger('debug0.x') crea un logger x che è un figlio di debug0 che è figlio del logger di root. Quando si accede a questo registratore, esso trasmetterà il messaggio al suo genitore e il suo genitore passerà il messaggio al logger principale. Hai configurato il logger di root per accedere a un file tramite la funzione basicConfig(), quindi il tuo messaggio finirà lì.

+0

Quindi qual è la procedura migliore per ottenere un programma di registrazione in Python? In Java basta fare un 'getLogger (getClass(). GetName())' (o qualche metodo di convenienza 'getLogger (getClass())', che delega all'altro metodo che ho menzionato). Cosa dovremmo usare in Python? Sicuramente non dobbiamo creare alcun ID del logger e collegarlo manualmente per ogni modulo che creiamo. –

+2

@Garret L'approccio più comune in Python è utilizzare 'logger = logging.getLogger (__ nome __) 'nella parte superiore di ogni modulo. La variabile '__name__' contiene il nome puntato del modulo corrente. –

+1

Qualsiasi motivo per cui la migliore pratica non è quella di usare '_logger' in modo che la variabile non sia esposta quando il modulo viene importato? –

10

Se si controlla il codice o il doc:

>>> print logging.basicConfig.__doc__ 

    Do basic configuration for the logging system. 

    This function does nothing if the root logger already has handlers 
    configured. ............... 
    A number of optional keyword arguments may be specified, which can alter 
    the default behaviour. 

    filename Specifies that a FileHandler be created, using the specified 
       filename, rather than a StreamHandler. 
    filemode Specifies the mode to open the file, if filename is specified 
       (if filemode is unspecified, it defaults to 'a'). 
    format Use the specified format string for the handler. 
    datefmt Use the specified date/time format. 
    level  Set the root logger level to the specified level. 
    stream Use the specified stream to initialize the StreamHandler. Note 
       that this argument is incompatible with 'filename' - if both 
       are present, 'stream' is ignored. 

logging.basicConfig non usa nome dell'argomento a tutti. Inizializza il logger root. Mentre getLogger prende un argomento "nome"

>>> print logging.getLogger.__doc__ 

    Return a logger with the specified name, creating it if necessary. 

    If no name is specified, return the root logger. 
Problemi correlati