2011-11-25 42 views
10

Sto utilizzando il modulo di registrazione Python in un mio semplice script con il seguente setup al momento.Registrazione solo da registro Python dallo script

logging.basicConfig(format='%(asctime)s %(message)s', level=logging.INFO, datefmt='%Y-%m-%d %H:%M:%S') 
logger = logging.getLogger(__name__) 

Il mio problema è che questa cattura anche i moduli 3a parte come richieste e le informazioni in uscita() i messaggi di log da loro. C'è un modo per sopprimere questi messaggi o dire al modulo di registrazione solo di registrare i messaggi dal mio script?

risposta

10

Utilizzando taglialegna di nome nei moduli:

import logging 
logger = logging.getLogger(__name__) 
logger.info("my info") 
logger.error("my error") 

è possibile impostare il livello di log per tutti gli altri software per errore e per i vostri logger per il debug:

import logging 
logging.basicConfig(level=logging.ERROR) 
logging.getLogger(my_module.__name__).setLevel(logging.DEBUG) 
0

La risposta di cui sopra non è veramente corretto - sarà sufficiente impostare la barra più in alto per i messaggi da altri moduli da mostrare.

Un approccio molto veloce sarebbe quella di utilizzare questo pezzo di codice:

import logging.config 
logging.config.dictConfig({ 
    'version': 1, 
    'disable_existing_loggers': True, 
}) 

È necessario impostare questo dopo l'importazione di tutti i moduli - che verrà disattivare tutti i logger che sono stati creati fino a questo punto. Ciò funzionerà la maggior parte del tempo, ma alcuni moduli creano il loro logger quando si crea un'istanza di classe per esempio (cosa che succederebbe più avanti nel codice).


Quando si imposta logger secondo il tutorial di pitone base ti dicono di usare logging.basicConfig(...). Questo è un problema in quanto ciò imposterà il gestore (al quale verrà indirizzato il log) su logging.lastResort che è stderr che inizia con Python 3.2 per logger a livello globale nel processo. Ciò significa che ora hai abilitato la registrazione completa per tutti i moduli.

Quindi un approccio migliore è quello di creare un logger diverso solo per i moduli e dargli alcuni gestori proprio invece di utilizzare basicConfig().

Ci sono due modi per farlo:

1) Tutte le funzioni:

import logging 

log = logging.getLogger(__name__) 
log.setLevel(logging.DEBUG) 
formatter = logging.Formatter(fmt="%(asctime)s %(levelname)s: %(message)s", 
          datefmt="%Y-%m-%d - %H:%M:%S") 
ch = logging.StreamHandler(sys.stdout) 
ch.setLevel(logging.DEBUG) 
ch.setFormatter(formatter) 
fh = logging.FileHandler("mylog.log", "w") 
fh.setLevel(logging.DEBUG) 
fh.setFormatter(formatter) 
log.addHandler(ch) 
log.addHandler(fh) 

Questo vi darà il logger log che è possibile utilizzare come log.error("Error found"). Scriverà in un nuovo file chiamato mylog.log e registrerà anche sys.stdout. Puoi cambiarlo come vuoi, ovviamente.

2) Con un dict:

import logging 
import logging.config 

DEFAULT_LOGGING = { 
    'version': 1, 
    'formatters': { 
     'standard': { 
      'format': '%(asctime)s %(levelname)s: %(message)s', 
      'datefmt': '%Y-%m-%d - %H:%M:%S' }, 
    }, 
    'handlers': { 
     'console': {'class': 'logging.StreamHandler', 
        'formatter': "standard", 
        'level': 'DEBUG', 
        'stream': sys.stdout}, 
     'file':  {'class': 'logging.FileHandler', 
        'formatter': "standard", 
        'level': 'DEBUG', 
        'filename': 'live_detector.log','mode': 'w'} 
    }, 
    'loggers': { 
     __name__: {'level': 'INFO', 
        'handlers': ['console', 'file'], 
        'propagate': False }, 
    } 
} 

logging.config.dictConfig(DEFAULT_LOGGING) 
log = logging.getLogger(__name__) 

Questo vi darà lo stesso risultato di cui sopra, un po 'più a lungo, ma forse più facile da leggere. Questo imposta automaticamente anche 'disable_existing_loggers': True. Se non lo vuoi, devi aggiungerlo e impostarlo su False.

Problemi correlati