2012-11-01 12 views
16

Sto lavorando con Django-nonrel su Google App Engine, che mi obbliga a usare logging.debug() invece di print().Python- Come scaricare il log? (django)

Il modulo di "logging" è fornito da Django, ma ho un brutto momento di usarlo al posto di print().

Ad esempio, se devo verificare il contenuto contenuto nella variabile x, inserirò
logging.debug('x is: %s' % x). Ma se il programma si blocca subito dopo (senza svuotare il flusso), non viene mai stampato.

Quindi per il debug, ho bisogno di debug() per essere svuotato prima che il programma esca per errore, e questo non sta accadendo.

+0

non è una risposta alla tua domanda, ma perché dovresti usare 'print' comunque ?! – aschmid00

+1

Cosa intendi esattamente "svuotando" il log? –

+0

Speriamo che l'esempio elencato aiuti nella comprensione. – Rucent88

risposta

9

Penso che questo possa funzionare per voi, supponendo che si sta utilizzando solo uno (o di default) gestore:

>>> import logging 
>>> logger = logging.getLogger() 
>>> logging.debug('wat wat') 
>>> logger.handlers[0].flush() 

È un po 'visto di buon occhio nella documentazione, però.

Il codice dell'applicazione non deve creare un'istanza diretta e utilizzare le istanze di Gestore. Invece, la classe Handler è una classe base che definisce l'interfaccia che tutti i gestori dovrebbero avere e stabilisce un comportamento predefinito che le classi figlio possono usare (o sovrascrivere). http://docs.python.org/2/howto/logging.html#handler-basic

E potrebbe essere una fuga di prestazioni, ma se siete veramente bloccato, questo può aiutare con il debug.

+1

Uh, quante persone dovrebbero scaricare i propri registri se l'unico modo è attraverso un gestore a cui non si deve accedere? Sembra rotto. –

+1

No, non è affatto ciò che dice la documentazione. La citazione sopra indica che dovresti solo istanziare e usare * sottoclassi * di Handler, invece di Handler direttamente. Il tuo codice utilizza solo le classi di gestori che sono già state istanziate da qualcun altro, quindi non c'è alcun problema. – Hjulle

+3

Molto utile in effetti; Trovo ancora estremamente strano che non sia in grado di dire allo stupido logger nella sua configurazione che è sempre a filo; ma che il mio codice cliente deve far rispettare questo. – GhostCat

5

La registrazione di Django si basa sul modulo di registrazione Python standard.

Questo modulo ha un metodo a livello di modulo: logging.shutdown() che scarica tutti i gestori e arresta il sistema di registrazione (cioè la registrazione non può più essere utilizzata dopo che viene chiamato)

Controllo il codice di questa funzione mostra che attualmente (python 2.7) il modulo di registrazione contiene un elenco di riferimenti deboli a tutti i gestori di una variabile a livello di modulo chiamato _handlerList così tutti i gestori possono essere lavato facendo qualcosa di simile

[h_weak_ref().flush() for h_weak_ref in logging._handlerList] 

perché questa soluzione utilizza la interni del modulo @Mikes soluzione sopra è meglio, ma è rel i per avere accesso ad un registratore, che possono essere generalizzati come segue:

[h.flush() for h in my_logger.handlerList] 
1

Se il caso d'uso è che si dispone di un programma Python che dovrebbe irrigare i registri quando si esce, utilizzare logging.shutdown().

Dalla documentazione pitone:

logging.shutdown()

informa il sistema di registrazione per eseguire una ordinata arresto da svuotando e chiudendo tutti i gestori. Questo dovrebbe essere chiamato all'uscita dell'applicazione e nessun ulteriore utilizzo del sistema di registrazione dovrebbe essere effettuato dopo questa chiamata.

4

Ho faticato con un problema simile ed ecco come ho risolto.Invece di utilizzare il modulo logging direttamente all'uscita vostro log, inizializzare il proprio logger come segue:

import sys 
import logging 


def init_logger(): 
    logger = logging.getLogger() 

    h = logging.StreamHandler(sys.stdout) 
    h.flush = sys.stdout.flush 
    logger.addHandler(h) 

    return logger 

Poi, usarlo al posto del logging nel codice:

def f(): 
    logger = init_logger() 
    logger.debug('...') 

Di conseguenza, hai vinto' Ho più problemi con i log di flussaggio.

Problemi correlati