Agregar un sello de fecha y hora a la impresión de Python

Estoy tratando de depurar el comportamiento de una gran biblioteca de la que dependo, que utiliza una dispersión (sin hacer tantas cosas) de las declaraciones de impresión de depuración a través de sus muchos archivos de origen. El problema es que la mayoría, si no todas, estas declaraciones de impresión de depuración no contienen una marca de fecha / hora, por lo que es difícil asociar las fallas en el nivel de la aplicación con las fallas dentro del código de la biblioteca.

En lugar de modificar el código fuente para todas las impresiones de depuración sospechosas de estar involucradas en la falla que estoy viendo, pensé que podría ser posible parchear la “función” de impresión de Python incorporada temporalmente , para que toda la salida tenga el prefijo una marca de tiempo

Dado que la impresión integrada no es una función en el entorno de Python 2.6 con el que estoy trabajando, no sé si esto es posible. Si alguien ha hecho esto o ha logrado un resultado similar utilizando otro gancho en Python, le agradecería su consejo, o incluso mejor el código para una solución a este problema.

Como no puede anular la función de write (es de solo lectura), un simple parche de mono podría tener este aspecto (adjuntando la marca de tiempo a cada línea impresa):

 old_f = sys.stdout class F: def write(self, x): old_f.write(x.replace("\n", " [%s]\n" % str(datetime.now()))) sys.stdout = F() 

Un ejemplo sería el siguiente:

 >>> print "foo" foo [2011-02-03 09:31:05.226899] 

Solución alternativa que la marca de tiempo es el principio (antepuesto) en lugar del final (anexado):

 old_out = sys.stdout class St_ampe_dOut: """Stamped stdout.""" nl = True def write(self, x): """Write function overloaded.""" if x == '\n': old_out.write(x) self.nl = True elif self.nl: old_out.write('%s> %s' % (str(dt.now()), x)) self.nl = False else: old_out.write(x) sys.stdout = St_ampe_dOut() 

No estoy 100% seguro de cómo la respuesta existente de Velizar maneja los casos en que la salida se envía con múltiples \ n. No estoy seguro de si funciona de manera confiable, y si lo hace, creo que puede depender de un comportamiento potencialmente indocumentado de las secuencias de salida.

Aquí está mi solución que agrega una marca de tiempo al inicio de cada línea impresa, y maneja múltiples líneas / líneas sin \ n confiablemente:

 class TimestampFilter: # pending_output stores any output passed to write where a \n has not yet been found pending_output = '' def write(self, message): output = self.pending_output + message (output, not_used, self.pending_output) = output.rpartition('\n') if output != '': timestamp = time.strftime("%Y-%m-%d %X") output = timestamp + " " + output.replace("\n", "\n"+timestamp+" ") print(output, file=sys.__stdout__) sys.__stdout__.flush() sys.stdout = TimestampFilter()