values multiple logger log example disable_existing_loggers python logging printing

python - multiple - redirigir impresiones a archivo de registro



python logging level values (7)

Deberías echar un vistazo al módulo de registro de Python.

EDITAR: Código de muestra:

import logging if __name__ == "__main__": logging.basicConfig(level=logging.DEBUG, filename="logfile", filemode="a+", format="%(asctime)-15s %(levelname)-8s %(message)s") logging.info("hello")

Produce un archivo llamado "logfile" con contenido:

2012-10-18 06:40:03,582 INFO hello

Bueno. He completado mi primer programa de Python. Tiene alrededor de 1000 líneas de código. Durante el desarrollo, coloqué un montón de sentencias de print antes de ejecutar un comando usando os.system() ejemplo,

print "running command",cmd os.system(cmd)

Ahora he completado el programa. Pensé en comentarlos pero redirigir todas estas impresiones innecesarias (no puedo eliminar todas print declaraciones de print , ya que algunas proporcionan información útil para el usuario) en un archivo de registro, ¿será más útil? Cualquier trucos o consejos.


Puede crear un archivo de registro y prepararlo para escribir. Luego crea una función:

def write_log(*args): line = '' ''.join([str(a) for a in args]) log_file.write(line+''/n'') print(line)

y luego reemplace el nombre de su función print () con write_log ()


Puede redireccionar reemplazar sys.stdout con cualquier objeto que tenga la misma interfaz que sys.stdout, en la escritura de ese objeto puede imprimir en la terminal y también en el archivo. Por ejemplo, consulte esta receta http://code.activestate.com/recipes/119404-print-hook/


Python le permite capturar y asignar sys.stdout, como se mencionó, para hacer esto:

import sys old_stdout = sys.stdout log_file = open("message.log","w") sys.stdout = log_file print "this will be written to message.log" sys.stdout = old_stdout log_file.close()


Si coloca su propio archivo como en sys.stdout podrá capturar la salida de texto a través de la print .



  • La próxima vez, estará más contento si, en lugar de utilizar declaraciones print , use el módulo de logging desde el principio. Proporciona el control que desea y puede hacer que se escriba en la salida estándar mientras todavía está donde lo desea.

  • Muchas personas aquí han sugerido redirigir stdout. Esta es una solución fea. Muta un objeto global y, lo que es peor, lo muda para el uso de este módulo. print >>my_file, foo hacer una expresión regular que cambie todas las print foo para print >>my_file, foo y configurar my_file en stdout o en un archivo real de mi elección.

    • Si tiene otras partes de la aplicación que realmente dependen de escribir en stdout (o alguna vez lo hará en el futuro pero aún no lo sabe), esto las rompe. Incluso si no lo haces, hace que la lectura de tu módulo parezca que hace una cosa cuando en realidad hace otra si te has perdido una pequeña fila en la parte superior.
    • La impresión de Chevron es bastante fea, pero no tan fea como el cambio temporal de sys.stdout para el proceso.
    • Técnicamente hablando, un reemplazo de expresiones regulares no es capaz de hacer esto correctamente (por ejemplo, podría hacer falsos positivos si está dentro de un literal de cadena multilínea). Sin embargo, es probable que funcione, simplemente vigílalo.
  • os.system es prácticamente siempre inferior al uso del módulo de subprocess . Este último no necesita invocar el shell, no pasa las señales de una manera que generalmente no es deseada y se puede usar de manera no bloqueante.