2012-09-18 15 views
6

Se esistono istruzioni di registrazione distribuite su una base di codice, come faccio a configurare il registratore in modo da non dover commentare ogni chiamata al registratore quando si distribuisce il codice in produzione?Come disattivare le dichiarazioni di registrazione senza rimuoverle dal codice

Ecco il mio codice corrente:

import logging 


logging.basicConfig(filename='./example.log', level=logging.DEBUG, 
        format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s', 
        datefmt='%m-%d %H:%M') 

logging.debug('debug failed') 
logging.info('info failed') 
logging.warning('A warning') 
+1

Non si tratta di registrazione di base 101? – delnan

+2

@delman: se la sua 101 poi si prega di scrivere una risposta migliore pratica – Merlin

+0

Non sono qualificato per questo, sono solo piuttosto certo che il modo ovvio di farlo, l'impostazione del filtro per rifiutare tutti i messaggi, è descritto in qualsiasi registrazione decente tutorial. – delnan

risposta

1

ci sono livelli di registrazione. In base alla gravità del livello di registrazione, verrà stampato.

Level Numeric value 
CRITICAL 50 
ERROR 40 
WARNING  30 
INFO 20 
DEBUG 10 
NOTSET 0 

In base al livello di registrazione, stampa le dichiarazioni.

il livello specificato qui è level = logging.DEBUG. Quindi tutti i livelli di registrazione, tranne quelli notificati, dovrebbero essere stampati. Se si vuole stampare solo i livelli critici, si prega di modificare il livello = logging.CRITICAL

http://docs.python.org/release/2.5/lib/module-logging.html ha più informazioni

3

Invece di usare il basicConfig, è possibile impostare il registratore in modo più esplicito con i gestori che si desidera , in base a qualsiasi criterio.

import logging 

log = logging.getLogger("FOO") 
log.setLevel(logging.DEBUG) 

# needs a handler 
log.info('info') 
#No handlers could be found for logger "FOO" 

ch = logging.StreamHandler() 
log.addHandler(ch) 
log.info('info') 
# info 

log.removeHandler(ch) 

noop = logging.NullHandler() 
log.addHandler(noop) 
# nothing happens here 
log.info('info') 

Si può avere un'istruzione condizionale che sia aggiunge il gestore che si desidera se si esegue in modalità debug, oppure è possibile aggiungere un NullHandler che solo assorbe i messaggi di log. Puoi anche configurare i livelli individualmente di ogni gestore, in modo che tu veda sempre gli avvertimenti e sopra. Ogni gestore può avere il proprio livello, oltre al registratore principale.

È possibile refer to the tutorials su come ottenere più specifici con livelli, gestori e formattazione.

+0

Vedo il tuo punto, La vera domanda: puoi impostare il filtro come avvertimento e fare in modo che l'avvertimento entri in un buco nero.Quando è necessario eseguire il dump per archiviare, magari giocando con NullHandler. – Merlin

+0

Giocare con basicConfig e impostare il livello su "99" sembrava funzionare. file creato, nessuna stampa su console o file. – Merlin

+0

È possibile aggiungere diversi gestori in base ai flag nello script. Se lo si esegue con un flag di debug si potrebbe avere aggiungere un gestore di file. Altrimenti si aggiunge un gestore null. E puoi aggiungere più gestori. Forse un StreamHandler impostato su avviso stampa sempre avvertimenti o maggiore, e quindi il gestore file opzionale è impostato per eseguire il debug per catturare tutti i livelli di debug. L'impostazione del livello a 99 lo rende così alto che nessun livello di log lo abbinerà. Non è davvero un modo comune. – jdi

1

Ci sono un paio di risposte molto semplici qui. Il primo è semplicemente commentare la dichiarazione basicConfig(...). Ciò avrà l'effetto di non impostare nessuno dei logger, handler o formattatori, il che significa che le chiamate debug(), info(), ecc. Saranno effettivamente no-op.

Un'altra semplice risposta è impostare il livello di registrazione nella chiamata basicConfig() a un valore superiore a DEBUG. CRITICAL + 1 farebbe in modo di non vedere mai un messaggio di registro.

Tuttavia hai menzionato qualcosa sullo spostamento di questo codice in produzione, quindi quello che probabilmente vorrai fare è fornire le opzioni di riga di comando -q e -v (supponendo che questo sia uno strumento CLI). Il mio approccio abituale è quello di iniziare dal livello WARNING, e per ogni -q passare a una registrazione più silenziosa aumentando il livello del filtro. Al contrario, per ogni -v, passare a una registrazione più dettagliata. Ecco uno snippet di codice che fa esattamente questo.

from argparse import ArgumentParser 
from logging import basicConfig, CRITICAL, ERROR, WARNING, INFO, DEBUG 

parser = ArgumentParser() 
parser.add_argument("-v", "--verbose", action="count") 
parser.add_argument("-q", "--quiet", action="count") 

arguments = parser.parse_args() 

raw_log_level = 2 + (arguments.verbose or 0) - (arguments.quiet or 0) 
if raw_log_level <= 0: 
    log_level = CRITICAL 
elif raw_log_level == 1: 
    log_level = ERROR 
elif raw_log_level == 2:  # default 
    log_level = WARNING 
elif raw_log_level == 3: 
    log_level = INFO 
else:   
    log_level = DEBUG 

basicConfig(level=log_level) 
Problemi correlati