2011-02-03 14 views
7

Estoy tratando de depurar el comportamiento de una gran biblioteca De la que dependo, que utiliza una dispersión (no hacer esa plétora) de instrucciones de impresión de depuración a través de sus muchos archivos fuente. El problema es que la mayoría, si no todas, estas instrucciones 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.Agregar un sello de fecha y hora a Python imprimir

En lugar de modificar el código fuente de todas las impresiones de depuración sospechosos de estar involucrados en el fallo que estoy viendo, pensé que podría ser posible mono parchear el built-in de impresión Python "función" temporalmente, con el fin que todos los resultados tienen un prefijo con una marca de tiempo.

Desde el built-in print is not a function 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 enlace en Python, le agradecería su consejo, o incluso mejor, el código para una solución a este problema.

+0

¿Qué hay de malo en cambiar las impresiones dispersas a las solicitudes adecuadas de "registro"? ¿Por qué no solo arregla esta biblioteca de la que dependes? Sería (a) menos de su tiempo y (b) una solución permanente. ¿Por qué no cambiar la fuente? –

+0

Desde mi punto de vista es simplemente una cuestión de tiempo requerido. Políticamente, la base de código es "propiedad" de un número de personas diferentes y no es evidente ningún estándar para administrar la salida DEBUG. No todos pueden apreciar mi propuesta de adoptar el enfoque del módulo de registro, sin importar la buena idea que pueda parecernos a usted y a usted. – codeasone

Respuesta

16

Como no se puede reemplazar la función write (que es de sólo lectura) un simple mono-parche podría tener este aspecto (introducción de la marca de tiempo de 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 aspecto como esta:

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

Muy bien, esto se parece a lo que estoy buscando. Gracias. – codeasone

+0

Increíble lo que puedes lograr con Python. ¡Exactamente la funcionalidad que estaba buscando! ¡Muchas gracias! – szalski

+1

Es vulnerable al caso cuando se llama a una función diferente en sys.stdout. Lamentablemente, no estoy seguro de si eso se puede solucionar con este enfoque – nln

5

solución alternativa que la marca de tiempo es el comienzo (antepuesto) en lugar de extremo (adjuntas):

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() 
Cuestiones relacionadas