2013-06-20 17 views
5

Ho trovato la risposta this a un problema apparentemente simile, tuttavia (dato che sono novizio in Python) non sono sicuro di come implementare questa soluzione nel mio codice (se è lo stesso problema dopo tutti).I messaggi di log compaiono due volte nella console Python

Nel mio codice ho la seguente sezione:

logging.basicConfig(level=logging.DEBUG, 
        format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s', 
        filename='C:\\Tests\\TRACE.log', 
        filemode='a') 
console = logging.StreamHandler() 
console.setLevel(logging.INFO) 
consoleFormatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s') 
console.setFormatter(consoleFormatter) 
logging.getLogger('').addHandler(console) 
localLog = logging.getLogger('text') 

La cosa divertente è che ha usato per funzionare bene ma ad un certo momento ha iniziato a scrivere questi messaggi duplicati per consolare.

Qualcuno potrebbe darmi una guida qui per favore?

risposta

5

Sembra che ho capito la fonte di questo problema.

Il fatto è che ho usato il logger a livello di modulo. Sembra piuttosto logico, ma c'è una trappola: il modulo di registrazione Python rispetta tutto il logger creato prima di caricare la configurazione da un file. Quindi, sostanzialmente, quando stavo importando un modulo (che utilizza internamente il registratore) su un codice principale (dove stavo chiamando anche un logger), ho ottenuto lo streaming dei dati del logger due volte.

Le possibili soluzioni a questo problema sono:

  1. non ottengono logger a livello di modulo
  2. Impostare disable_existing_loggers a False. Aggiunto dal Python 2,7
5

In genere le istruzioni del registro duplicate si verificano perché sono collegati due gestori separati che indirizzano le istruzioni del registro nello stesso punto. Ci sono un paio di cose da provare per arrivare alla radice del problema:

  1. come commento la chiamata a logging.basicConfig - se questo elimina le dichiarazioni di registro duplicate allora questo significa che è probabile che non si fa è necessario configurare manualmente il secondo gestore di registri.
  2. Se si utilizza un IDE, può valere la pena inserire un punto di interruzione in un'istruzione di registro e passare all'utilizzo del debugger in modo da poter analizzare lo stato della configurazione del registro Python per ottenere un'immagine più chiara di quali diversi gestori sono collegati.

Per rendere il vostro registrazione più facile da gestire, può valere la pena cercando di spostare la configurazione fuori del codice e in un file di configurazione - il documento su Python logging configuration è un ottimo punto di partenza.

+1

Ciao e grazie per la risposta, ma come posso commentare tutte le ' loggingBasicConfig'? Include le impostazioni obbligatorie come percorso, formato e filemode ... –

+1

Dalla lettura della domanda, sembra che si stiano ricevendo messaggi di registro duplicati nella console e che la registrazione dei file non sia il problema. Il mio sospetto è che basicConfig stia configurando un gestore di log della console e quindi si sta configurando un secondo gestore di log della console. Raccomando vivamente di spostare la configurazione di registrazione in un file di configurazione in cui è possibile essere più espliciti sulla configurazione specifica. – robjohncox

+1

Una cosa che vale la pena sottolineare è che il logging su file, console o qualsiasi altra destinazione non è obbligatorio - la registrazione è semplicemente un modo per indirizzare i messaggi verso un luogo utile per visualizzarli o memorizzarli, e ci sono molti posti diversi che potresti voler inviarli (file e console sono due opzioni molto comuni). Consigliamo vivamente di lavorare attraverso il [tutorial di registrazione avanzato] (http://docs.python.org/2/howto/logging.html#advanced-logging-tutorial) nella documentazione di Python per ottenere una solida introduzione sul funzionamento del logging. – robjohncox

0

ho avuto la stessa situazione con la mia configurazione logger, la correzione che ho usato è stato:

class Logger: 

@staticmethod 
def setup(name, file_name): 

    log_file = <path to save the file> 
    log_file_max_size = 1024 * 1024 * 20 # megabytes 
    log_num_backups = 3 
    log_format = "%(asctime)s [%(levelname)s]: %(filename)s(%(funcName)s:%(lineno)s) >> %(message)s" 
    log_filemode = "w" # w: overwrite; a: append 
    logging.basicConfig(filename=log_file, format=log_format, filemode=log_filemode, level=logging.DEBUG) 
    rotate_file = logging.handlers.RotatingFileHandler(
     log_file, maxBytes=log_file_max_size, backupCount=log_num_backups 
    ) 
    logger = logging.getLogger(name) 
    # Console output line. 
    console_handler = logging.StreamHandler() 
    console_handler.setLevel(logging.INFO) 
    log_formatter = logging.Formatter(log_format) 
    console_handler.setFormatter(log_formatter) 
    logger.handlers = rotate_file, console_handler 

    return logger 
Problemi correlati