2011-01-18 15 views
12

Tengo tres clases en python y se ejecutan en diferentes subprocesos. Me gustaría tener salida al mismo archivo de todas las clases. En este momento creé el método de salida en la clase principal y pasándolo a través de constructores a otras clases. ¿Hay forma de manejarlo mejor? ¿Cómo puedo pasar el registrador entre clases excepto usar contructors?Registro entre clases en python

Quizás python es compatible con algo así como el método estático en Java, por lo que puedo escribir como Logger.info (mensaje) en las tres clases?

Otra forma probablemente podría ser redirigiendo sys.stdout global para el archivo, es decir especificando

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

A continuación, utilizando las llamadas sys.stdout en todas las clases.

¿Qué opinas?

Respuesta

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!") 

y ponerse en 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 

Tenga en cuenta que el orden en que los mensajes aparecen en el archivo de registro puede no corresponder exactamente a la orden en el que ocurrieron cuando se está acumulando de varios hilos.

+1

@lazyr. Gracias por la respuesta. ¿Cómo puedo pasar el objeto de registro entre clases para que los tres archivos escriban en el mismo archivo de registro? – yart

+1

Tengo el código anterior en un archivo separado, digamos log.py, luego voy "desde el log log de importación" en cada uno de mis otros módulos. Python solo carga un módulo una vez, cualquier instrucción de importación después de la primera simplemente recupera lo que ya se ha cargado, por lo que será el mismo objeto de registro en todos sus hilos. –

+4

@lazyr: en el caso del módulo 'logging', no necesita hacer eso - el módulo' logging' en sí mantiene los registradores que crea dentro de su propio módulo. Puede ejecutar 'logging.getLogger' nuevamente en otro módulo y obtendrá el mismo objeto. – nosklo