2011-08-02 7 views
37

Para la depuración simple en un proyecto complejo, ¿hay alguna razón para usar el registrador de Python en lugar de imprimir? ¿Qué hay de otros casos de uso? ¿Hay un mejor caso de uso aceptado para cada uno (especialmente cuando solo está buscando stdout)?En python, ¿por qué usar el registro en lugar de imprimir?

Siempre he escuchado que esta es una "mejor práctica" pero no he podido averiguar por qué.

+1

Para grandes proyectos, el registro es siempre una "mejor práctica" porque puede activarlo o desactivarlo fácilmente y obtener más o menos información. print no ofrece ninguna de estas ventajas. –

+0

Ver es decir, http://blog.tplus1.com/index.php/2007/09/28/the-python-logging-module-is-much-better-than-print-statements/ – agf

+1

No creo que haya * ever * el mejor caso de uso para 'print'. – SingleNegationElimination

Respuesta

46

El paquete de registro tiene un montón de características útiles: (. Incluso qué línea hay)

  • fácil de ver dónde y cuando una llamada de registro está siendo hecha de.
  • Puede iniciar sesión en archivos, sockets, casi cualquier cosa, todo al mismo tiempo.
  • Puede diferenciar su registro según la gravedad.

La impresión no tiene ninguno de estos.

Además, si su proyecto está destinado a ser importado por otras herramientas de python, es una mala práctica para su paquete imprimir cosas a stdout, ya que es probable que el usuario no sepa de dónde provienen los mensajes de impresión. Con el registro, los usuarios de su paquete pueden elegir si desean o no proponer mensajes de registro desde su herramienta.

+1

Muy bien dicho. A veces utilizaré la función de impresión para depurar un script desechable que pretendo ejecutar exactamente una vez, pero cualquier código que alguna vez haya sido visto por otros ojos humanos o que esté destinado a durar más de un día se convierte en registrador. – TimothyAWiseman

14

Una de las mayores ventajas del registro adecuado es que puede categorizar los mensajes y activarlos o desactivarlos según lo que necesite. Por ejemplo, podría ser útil activar los mensajes de nivel de depuración para una determinada parte del proyecto, pero atenuarlo para otras partes, a fin de no ser absorbido por la sobrecarga de información y concentrarse fácilmente en la tarea que necesita explotación florestal.

Además, los registros son configurables. Puede filtrarlos fácilmente, enviarlos a archivos, formatearlos, agregar marcas de tiempo y cualquier otra cosa que pueda necesitar a nivel mundial. Las declaraciones de impresión no se pueden administrar fácilmente.

+3

+1 para enviar salida a los archivos – mgalgs

+2

Definitivamente +1 para enviar salida a archivos. Analizar un archivo de registro en la autopsia es mucho mejor que tener que volver a romperlo en una ventana de consola abierta para encontrar el error. Básicamente, un registrador es ideal para cada vez que necesite depurar el script después de que haya fallado en lugar de hacerlo mientras falla. También es ideal para cualquier momento en que tenga que depurar un problema complejo que requiere que analice la salida del programa. Básicamente, cada vez que se trata de errores más complejos que los de sintaxis, un registrador probablemente simplificará eso para usted. – Jonathanb

4

Si utiliza el registro, la persona responsable de la implementación puede configurar el registrador para enviarlo a una ubicación personalizada, con información personalizada. Si solo imprimes, eso es todo lo que obtienen.

5

Las declaraciones de impresión son el tipo de lo peor de ambos mundos, que combina los aspectos negativos de un depurador en línea con la instrumentación de diagnóstico. Tienes que modificar el programa pero no obtienes más, código útil de él.

Un depurador en línea le permite inspeccionar el estado de un programa en ejecución; Pero lo bueno de un depurador real es que no tiene que modificar la fuente; ni antes ni después de la sesión de depuración; Simplemente cargue el programa en el depurador, dígale al depurador dónde desea buscar y ya está todo listo.

La instrumentación de la aplicación puede requerir cierto trabajo por adelantado, modificando el código fuente de alguna manera, pero la salida de diagnóstico resultante puede tener enormes cantidades de detalles y puede activarse o desactivarse en un grado muy específico. El módulo de registro de Python puede mostrar no solo el mensaje registrado, sino también el archivo y la función que lo llamó, un rastreo si hubo uno, el momento real en que se emitió el mensaje, y así sucesivamente.Más que eso; instrumentación de diagnóstico necesita nunca eliminar; Es tan válido y útil cuando el programa está terminado y en producción como el día en que se agregó; pero puede tener su salida atorada en un archivo de registro donde no es probable que moleste a nadie, o el nivel de registro puede ser rechazado para mantener a salvo todos los mensajes más urgentes.

anticipar la necesidad o el uso de un depurador realmente no es más difícil que usar ipython mientras se está probando, y familiarizarse con los comandos que utiliza para controlar el depurador de pdb incorporado.

Cuando se encuentre pensando que una declaración impresa podría ser más fácil que usar pdb (como suele ser), encontrará que usar un registrador hace que su programa sea mucho más fácil de trabajar que si usa y más tarde eliminar declaraciones de impresión.

Tengo mi editor configurado para resaltar las declaraciones de impresión como errores de sintaxis, y las declaraciones de inicio de sesión como comentarios, ya que así es como los considero.

Cuestiones relacionadas