2012-01-28 22 views
15

In alcune altre tecnologie abbiamo occasionalmente utilizzato un livello di registro inferiore a DEBUG che credo fosse chiamato "verbose". Mi rendo conto che la necessità di un tale livello è molto soggettiva. Ma nella mia mente "solo" avere INFO e DEBUG non è abbastanza. Abbiamo avuto momenti in cui era necessario registrare qualcosa di molto spammoso (più spammy del debug). In pratica producevamo build senza questa funzionalità ma in alcune occasioni avremmo abilitato questo livello di registrazione dopo che il prodotto era stato installato su alcune impostazioni del QA, mentre rintracciavamo un bug, ecc.Registrazione Python - C'è qualcosa sotto DEBUG?

C'è qualche modo (facile o meno) di registrare qualcosa al di sotto del livello DEBUG usando la libreria di logging standard di Python?

In un file temp.py posso effettuare le seguenti operazioni:

logging.addLevelName(5,"verbose") 
VERBOSE = 5 

logger = logging.getLogger("foo") 
logger.setLevel(VERBOSE) 
logger.log(VERBOSE,"blah!") 

Questo funziona quando corro temp.py nel mio IDE (e tronchi allo stdout), ma i nostri veri demoni utilizzare il file/dizionario standard sintassi di configurazione per configurare la registrazione e non vedo alcun modo per indicare che il livello 5 dovrebbe essere usato per il demone.

Sto inseguendo qualcosa che non è realmente fattibile?

Per coloro che potrebbero chiedersi perché avrei bisogno di qualcosa di inferiore a DEBUG, è per il tipo occasionale di registrazione che potrebbe verificarsi molto frequentemente (forse un ciclo interno) che normalmente non vorrei vedere anche a DEBUG ma su alcuni sistemi di produzione potrebbe essere utile abilitarlo una volta ogni tanto senza aggiungere altro logging al codice sorgente e reimplementare, ecc.

EDIT1 - Chiaramente la libreria di registrazione consente livelli personalizzati. Dal momento che DEBUG è di livello 10, c'è spazio da qualche parte nella gamma 1..9. Se definisco un livello personalizzato (come nel codice di esempio sopra), suppongo che la mia vera domanda sia come abilitare quel livello di registrazione dal file di configurazione di json log?

EDIT2 - Il seguente funzionerebbe se non fosse per il fatto che abbiamo bisogno di file/uso di configurazione JSON (un requisito che non posso cambiare):

import logging 

logging.basicConfig(filename='example.log',level=5) 
VERBOSE = 5 
logging.addLevelName(5,"verbose") 
logger = logging.getLogger("bar") 
logger.log(VERBOSE,"blah!") 

Edit3 - figured it out ... La chiamata a

logging.addLevelName(5,"VERBOSE") 

è fondamentale. Non l'avevo proprio nel posto giusto. Nel mio caso ho solo bisogno di effettuare la chiamata sopra si svolge prima la chiamata alla chiamata dictConfig (...) librerie di registrazione. Dopo averlo fatto, sono stato in grado di accedere al nostro file di configurazione del registro e di eseguire il bump down (sia sul gestore di file che su root) su VERBOSE e ha funzionato.

scontato, la dichiarazione di log in sé non è esattamente elegante, perché si chiama:

self.logger.log(VERBOSE,"Something very spammy") 

piuttosto che

self.logger.verbose("Something very spammy") 

Ma io davvero non voleva modificare qualsiasi codice della libreria logger (stato lì, fatto questo, prendi la maglietta).

Grazie a tutti!

E a chi pensa nulla inferiore è necessaria DEBUG, più potere a voi :)

+2

"... utile per abilitare [...] una volta ogni tanto ..." suona esattamente * come 'DEBUG'. –

+0

Sì, in parte si tratta di interpretazioni soggettive di ciò che DEBUG significa contro INFO, ecc. Non metterei mai un'istruzione DEBUG in un loop interno che potrebbe eseguire centinaia di volte. Ma nelle aziende passate ogni tanto mettevo una dichiarazione verbale "dettagliata" all'interno di un tale ciclo. Capisco il tuo punto però. –

+1

ISTM la progettazione della registrazione è quella di effettuare chiamate di registrazione ovunque possano essere necessarie e quindi sopprimere un volume elevato con un filtro o un'impostazione di report una sola volta. –

risposta

15

DEBUG è il livello più basso di quelli forniti dal modulo di registrazione: ('DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL'). I loro valori numerici sono qui: http://docs.python.org/howto/logging.html#logging-levels

È possibile creare custom levels (anche se i documenti dicono che raramente sarà necessario e potrebbe anche essere indesiderabile). Se si desidera aggiungere un livello, the technique è semplice:

>>> logging.addLevelName(5, "VERBOSE") 

Benche 'si può aggiungere un livello personalizzato, può essere un approccio migliore per aggiungere alcuni filtri che forniscono un livello di controllo.

+1

Questo è certamente vero ma il framework consente chiaramente livelli personalizzati. DEBUG è il livello 10, quindi c'è ancora un po 'di spazio tra 1..9 :) Non sono sicuro di come usare un livello personalizzato in un modo che posso abilitare da un file di installazione di registrazione json standard. Immagino che sia davvero la mia domanda ... infatti modifico la mia domanda originale per far notare che questa è la parte che devo capire. –

+2

Hai ragione, tutto ciò di cui avevo bisogno era la chiamata logging.addLevelName (5, "VERBOSE"). Non ero sicuro di dove metterlo. Dopo averlo messo prima della chiamata a logging.config.dictConfig (...) ha funzionato! –

9

Si può anche andare oltre e aggiungere un metodo logger.verbose, anche se consiglio caldamente di non farlo per vari motivi (praticamente coperto in logging's how-to). In ogni caso, se si decide che si vuole veramente avere uno, ecco il codice:

logging.VERBOSE = 5 
logging.addLevelName(logging.VERBOSE, "VERBOSE") 
logging.Logger.verbose = lambda inst, msg, *args, **kwargs: inst.log(logging.VERBOSE, msg, *args, **kwargs) 
8

La risposta da @voitek grandi opere, ma ha dimenticato di patch di scimmia logging.verbose.

logging.VERBOSE = 5 
logging.addLevelName(logging.VERBOSE, "VERBOSE") 
logging.Logger.verbose = lambda inst, msg, *args, **kwargs: inst.log(logging.VERBOSE, msg, *args, **kwargs) 
logging.verbose = lambda msg, *args, **kwargs: logging.log(logging.VERBOSE, msg, *args, **kwargs) 

Questo ora funziona anche con;

logging.verbose(*args, **kwargs) 
Problemi correlati