2015-08-11 12 views
6

Sto utilizzando il modulo logging in python 3 e desidero che un particolare messaggio di avviso venga visualizzato una sola volta. Il problema è che il controllo è all'interno di un ciclo:Registrazione Python: messaggio di stampa solo una volta

def canned_example(): 
    logger.warning("This function hasn't been created yet") 


for i in range(10): 
    canned_example() 

C'è una bandiera per impostare all'interno del modulo di registrazione che denotano che questa particolare avviso è solo per essere visualizzato una volta? L'alternativa è tenere un registro di bandiere diverse, ma mi piacerebbe mantenerlo semplice se possibile.

Aggiornamento: Amir Yazdanbakhsh ha pubblicato una risposta nei commenti che ci consente di farlo per tutti i messaggi. Idealmente, vorrei un po 'di bandiera per-messaggio:

def canned_example(): 
    logger.warning("This function hasn't been created yet", norepeat=True) 


for i in range(10): 
    canned_example() 
+1

È possibile trovare la risposta qui: http://stackoverflow.com/questions/6506146/logging-in-continouous-loop –

+0

Un'ottima scoperta! Non sono riuscito a trovarlo su Google, quindi ho aggiunto alcune parole chiave lì. Non fa * del tutto * quello che voglio però - Voglio controllo per messaggio, ma lo farà per ora. – robertlayton

+1

Scrivi il tuo wrapper 'logging.warn' che tiene traccia dei messaggi che non vorresti ripetere. – 4ae1e1

risposta

1

definire un filtro che tiene traccia di ciò che è stato registrato, e allegare al vostro logger per tutta la durata del ciclo. Questo esempio ricorderà ogni messaggio che vede e consentirà solo di registrare la prima occorrenza.

class DuplicateFilter(object): 
    def __init__(self): 
     self.msgs = set() 

    def filter(self, record): 
     rv = record.msg not in self.msgs 
     self.msgs.add(record.msg) 
     return rv 

dup_filter = DuplicateFilter() 
logger.addFilter(dup_filter) 
for i in range(10): 
    canned_example() 
logger.removeFilter(dup_filter) 
+0

Basta non dimenticare che qualsiasi stringa che si registra rimarrà in memoria. –

+0

Vero; una soluzione rapida sarebbe aggiungere 'del dup_filter' dopo averlo rimosso dal registratore. Il garbage collector libererà la memoria nella sua prossima esecuzione. – chepner

Problemi correlati