2012-07-27 17 views
5

Ogni volta che penso di capire il modulo di registrazione, i gremlins entrano e cambiano il modo in cui funziona. (Ok, lo ammetto, quel gremlin potrebbe essere io a cambiare il mio codice.)Configurazione dei logger per bambini

Cosa sto facendo di sbagliato qui?

> ipython 
> import logging 
> log = logging.Logger("base") 
> log.addHandler(logging.StreamHandler()) 

> log.critical("Hi") 
Hi 

> log2 = log.getChild("ment") 

> log2.critical("hi") 
No handlers could be found for logger "base.ment" 

avrei giurato che in passato, sono stato in grado di utilizzare logger bambino senza configurazioni aggiuntive ...

+0

Provalo in una nuova sessione. Funziona per me usando ipython e anche come script. – unutbu

+0

Non funziona nemmeno per me in cPython 2.7.2. Mi chiedo se abbia qualcosa a che fare con la configurazione di default di un 'StreamHandler' ... Quando creo' log', aggiungo il gestore a 'log', quindi creo' log2', ottengo 'No handler', ma se creo 'log2' prima, poi aggiungo il gestore a' log', l'accesso a 'log2' non è un errore (anche se non stampa nulla). –

+0

@unutbu: Hmmm ... che * è * una nuova sessione. Ho incluso la riga di comando 'ipython' nella parte superiore per indicare che. Che tu sia in grado di gestirlo senza problemi mi dà una brutta sensazione. Sto eseguendo Python 2.7.1 e IPython 0.10. È stato così per un * lungo * tempo, quindi questo non sembra essere il problema. Io * so * ha a che fare con il mio codice ... –

risposta

5

Se si cambia

log = logging.Logger('base') 

a

log = logging.getLogger('base') 

quindi funziona:

import logging 

log = logging.getLogger('base') 
log.addHandler(logging.StreamHandler()) 
log.critical('Hi') 
log2 = log.getChild('ment') 
log2.critical('hi') 

cede

Hi 
hi 
+0

Stavo per provarlo ... buona cattura e grazie per l'aiuto! +1 –

+2

Argh, ho appena rintracciato questo ... Sì, il modulo di registrazione proxy invisibile attraverso 'logging.Manager' per creare logger. Quando create direttamente un logger con 'logging.Logger()' cortocircuiterete il sistema e le cose andranno in tilt. –

+0

Ho scavato nelle mie versioni mercuriali ed è esattamente quello che è successo.Ho "ripulito" il mio codice di accesso e ho scritto "Logger" anziché "getLogger". @ sr2222: Grazie per aver seguito la causa. Aiuta a capire perché ha fallito. Ora posso spostare il mio modello mentale da "caricare la registrazione e creare un logger" per "caricare la registrazione e creare un logger secondario". +1. Grazie! –

1

Più particolare: Si utilizza il modulo errato. :) Dall'osservazione del codice del modulo, sembra che non si aspetti di creare direttamente uno logging.Logger(). Molte delle funzioni disponibili direttamente sul modulo (ex getLogger()) e i metodi su logging.Logger() (ex getChild()) sono effettivamente proxy tramite un'istanza di logging.Manager creata dal modulo durante l'importazione. Quando si crea uno Logger con logging.Logger() direttamente, si sta effettivamente creando un'istanza Logger al di fuori dello Manager. Quando successivamente si chiama log.getChild(), il modulo sta effettivamente creando il nuovo logger all'interno di Manager, ma con il nome del registratore esterno Manager aggiunto alla parte anteriore del nome del registratore. Quindi il tuo gestore aggiunto a log non si trova nello Manager con il figlio generato, e quindi il gestore non funziona. Sono ancora un po 'confuso sul perché l'aggiunta di un gestore a log prima o dopo la creazione di log2 causa il log in modo diverso rispetto a log2. Non vedo cosa lo stia causando ...

+0

: "con logging.Logger() direttamente, si sta effettivamente creando un'istanza di Logger all'esterno di Manager. Quando successivamente si chiama log.getChild(), il modulo sta effettivamente creando il nuovo logger all'interno del Manager "Interessante. E ha un senso. Devo ricordare di pensare sempre "creare il sub-logger" ... anche quando si crea il "primo" logger del * mio * programma. –

Problemi correlati