2011-01-18 18 views
12

Ho tre classi in python e vengono eseguite in thread diversi. Mi piacerebbe avere l'output per lo stesso file da tutte le classi. In questo momento ho creato il metodo di output nella classe principale e lo ho passato attraverso i costruttori ad altre classi. C'è modo di gestirlo meglio? Come posso passare il logger tra le classi ad eccezione dell'utilizzo di contromisure?Registrazione tra le classi in python

Forse python supporta qualcosa come il metodo statico in Java, quindi posso scrivere come Logger.info (messaggio) in tutte e tre le classi?

Un altro modo probabilmente potrebbe essere il reindirizzamento sys.stdout globale per il file, cioè specificando

logger = open('debug.txt', 'w') 
sys.stdout = logger 

quindi utilizzando chiamate sys.stdout in tutte le classi.

Cosa ne pensi?

risposta

23
import logging 
log = logging.getLogger("mylog") 
log.setLevel(logging.DEBUG) 

formatter = logging.Formatter(
    "%(asctime)s %(threadName)-11s %(levelname)-10s %(message)s") 
# Alternative formatting available on python 3.2+: 
# formatter = logging.Formatter(
#  "{asctime} {threadName:>11} {levelname} {message}", style='{') 

# Log to file 
filehandler = logging.FileHandler("debug.txt", "w") 
filehandler.setLevel(logging.DEBUG) 
filehandler.setFormatter(formatter) 
log.addHandler(filehandler) 

# Log to stdout too 
streamhandler = logging.StreamHandler() 
streamhandler.setLevel(logging.INFO) 
streamhandler.setFormatter(formatter) 
log.addHandler(streamhandler) 

# Test it 
log.debug("Some message") 
log.error("An error!") 
try: 
    something() 
except: 
    log.exception("An exception occured!") 

E ottenere in debug.txt:

 
2011-01-18 12:07:24,943 MainThread DEBUG  Some message 
2011-01-18 12:07:24,943 MainThread ERROR  An error! 
2011-01-18 12:07:24,943 MainThread ERROR  An exception occured! 
Traceback (most recent call last): 
    File "./logtest.py", line 17, in 
    something() 
NameError: name 'something' is not defined 

Si noti che l'ordine in cui i messaggi vengono visualizzati nel file di registro potrebbe non corrispondere esattamente a l'ordine in cui sono avvenute quando si sta accedendo da diversi thread.

+1

@lazyr. Grazie per la risposta. Come posso passare l'oggetto log tra classi così tutti e tre i file e scriverà nello stesso file di log? – yart

+1

Ho il codice di cui sopra in un file separato, ad esempio log.py, quindi vado "da log import log" in ciascuno dei miei altri moduli. Python carica solo un modulo una volta - qualsiasi istruzione import dopo il primo si limita a recuperare ciò che è già stato caricato - quindi sarà lo stesso oggetto log in tutti i thread. –

+4

@lazyr: Nel caso del modulo 'logging', non è necessario farlo - il modulo' logging' mantiene i logger che crea all'interno del proprio modulo. Puoi semplicemente eseguire 'logging.getLogger' di nuovo in un altro modulo e otterrai lo stesso oggetto. – nosklo

Problemi correlati