2015-11-12 21 views
9

Quindi, stavo giocando con la libreria di Google Tensorflow pubblicata ieri e ho riscontrato un fastidioso bug che continua a mordermi.Tensorflow causa la duplicazione dei messaggi di registrazione

Quello che ho fatto è stato configurare le funzioni di registrazione di Python come faccio di solito, e il risultato è stato che, se importassi la libreria di tensorflow, tutti i messaggi nella console iniziarono a raddoppiare. È interessante notare che questo è non si verifica se si utilizza solo la funzione logging.warn/info/..().

Un esempio di codice che fa non il doppio dei messaggi:

import tensorflow as tf 
import logging 

logging.warn('test') 

Un esempio di codice che fa doppie tutti i messaggi:

import tensorflow as tf 
import logging 

logger = logging.getLogger('TEST') 
ch = logging.StreamHandler() 
logger.addHandler(ch) 

logger.warn('test') 

Ora, io sono un uomo semplice Mi piace la funzionalità di logging, quindi lo uso. L'installazione con l'oggetto logger e l'aggiunta di uno StreamHandler sono qualcosa che ho notato osservando come altre persone l'hanno fatto, ma sembra che si adatti a come la cosa doveva essere utilizzata. Tuttavia, non ho una conoscenza approfondita della libreria di registrazione, in quanto ha sempre funzionato.

Quindi, qualsiasi aiuto che spieghi perché si verifica il raddoppio dei messaggi sarà molto utile.

Sto usando Ubuntu 14.04.3 LTS con Python 2.7.6, ma l'errore si verifica in tutte le versioni di Python 2.7 che ho provato.

+0

che sto attraversando un periodo difficile replicare questo su Ubuntu 14.04 anche con Python 2.7.6: pitone testlog.py ATTENZIONE: root: prova Si può fornire un po 'più in dettaglio su come si è installato tf? – dga

+0

Ah! C'è un refuso nel codice di esempio. L'ultima riga dovrebbe essere logger.warn ('test') invece di logging.warn. Ora l'ho replicato. E la risposta è un po 'più chiara - aspetta. – dga

risposta

12

ottengo questo output:

test 
WARNING:TEST:test 

tensorflow è anche utilizzando il quadro di registrazione e ha istituito i propri gestori, in modo che quando si accede, per impostazione predefinita, si propaga fino ai gestori di registrazione genitore all'interno tensorflow. È possibile modificare questo comportamento impostando:

logger.propagate = False 

Vedi anche duplicate output in simple python logging configuration

ollowup: Questo è stato un effetto collaterale non intenzionale del modo in cui è stata tensorflow utilizzando il pacchetto di registrazione. L'ho cambiato in HEAD per esplorare i suoi logger interni sotto il nome di "tensorflow" per evitare questo inquinamento. Dovrebbe essere nella testa github entro un giorno o giù di lì. Nel frattempo, la soluzione logger.propagate funzionerà e non si interromperà una volta che la correzione è in, quindi dovresti essere sicuro di andare. Grazie ancora per aver scoperto questo!

+0

(Vado a verificare se questo è effettivamente previsto o un bug - Non l'ho mai incontrato o pensato troppo.) – dga

+0

Grazie per la risposta, ha funzionato come previsto! – 5xum

+0

Tensorflow non sta utilizzando il pacchetto di registrazione nel modo standard di fare getLogger (__ nome__), motivo per cui si sta verificando tale collisione nello spazio dei nomi. Invierò una patch per questo e vediamo se possiamo renderlo più felice. Grazie per avermelo chiesto! – dga