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
.
Una forma sencilla de redirigir stdout y stderr usando el módulo de registro está aquí: ¿Cómo duplico sys.stdout en un archivo de registro en Python?
La próxima vez, estará más contento si, en lugar de utilizar declaraciones
print
, use el módulo delogging
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 lasprint foo
paraprint >>my_file, foo
y configurarmy_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 desubprocess
. 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.