language-agnostic logging error-handling

language agnostic - ¿Cuáles son las mejores prácticas para registrar un error?



language-agnostic logging (8)

Apache Commons Logging no está destinado para el registro general de aplicaciones . Está destinado a ser utilizado por bibliotecas o API que no quieren forzar una implementación de inicio de sesión en el usuario de la API.

También hay problemas de carga de clases con Commons Logging.

Elija una de las [muchas] API de registro, la más utilizada probablemente sea log4j o la API de registro de Java .

Si desea independencia de implementación, es posible que desee considerar SLF4J , por el autor original de log4j.

Una vez elegida una implementación, utilice los niveles / severidad de registro dentro de esa implementación consistentemente , para que la búsqueda / filtrado de registros sea más fácil.

Muchas veces vi el registro de errores como estos:

System.out.println("Method aMethod with parameters a:"+a+" b: "+b); print("Error in line 88");

entonces ... ¿Cuáles son las mejores prácticas para registrar un error?

EDITAR:

Esto es java pero podría ser C / C ++, básico, etc.


La API de registro común de Apache, como se mencionó anteriormente, es un gran recurso. En referencia a java, también hay un flujo de salida de error estándar (System.err).

Directamente desde la API de Java:

Esta secuencia ya está abierta y lista para aceptar datos de salida.

Normalmente, esta secuencia corresponde a la salida de visualización u otro destino de salida especificado por el entorno o usuario del host. Por convención, esta secuencia de salida se usa para mostrar mensajes de error u otra información que debería llamar la atención inmediata de un usuario, incluso si el flujo principal de salida, el valor de la variable saliente, se ha redirigido a un archivo u otro destino que sea típicamente no monitoreado continuamente.


La forma más fácil de registrar errores en un formato coherente es utilizar un marco de registro como Log4j (suponiendo que esté utilizando Java). Es útil incluir una sección de registro en los estándares de su código para asegurarse de que todos los desarrolladores sepan qué se debe registrar. Lo bueno de la mayoría de los marcos de registro es que tienen diferentes niveles de registro para que pueda controlar qué tan detallado es el registro entre desarrollo, prueba y producción.


Realmente no hay una mejor práctica para registrar un error. Básicamente solo necesita seguir un patrón consistente (dentro del software / compañía / etc.) que proporcione suficiente información para rastrear el problema. Por ejemplo, es posible que desee realizar un seguimiento de la hora, el método, los parámetros, el método de llamada, etc.

Siempre y cuando no solo imprimas "Error in"


Una mejor práctica es usar el marco java.util.logging

Luego puede registrar mensajes en cualquiera de estos formatos

log.warning(".."); log.fine(".."); log.finer(".."); log.finest("..");

O

log.log(Level.WARNING, "blah blah blah", e);

Luego puede usar un logging.properties (ejemplo a continuación) para alternar entre niveles de registro y hacer todo tipo de cosas inteligentes, como iniciar sesión en archivos, con rotación, etc.

handlers = java.util.logging.ConsoleHandler .level = WARNING java.util.logging.ConsoleHandler.level = ALL com.example.blah = FINE com.example.testcomponents = FINEST

En mi opinión, deberían evitarse frameworks como log4j y otros, Java ya tiene todo lo que necesita.

EDITAR

Esto puede aplicarse como una práctica general para cualquier lenguaje de programación. Ser capaz de controlar todos los niveles de registro desde un único archivo de propiedades suele ser muy importante en las aplicaciones empresariales.


Algunas mejores prácticas sugeridas

  • Use un marco de trabajo de registro. Esto te permitirá:

    • Cambia fácilmente el destino de tus mensajes de registro
    • Filtrar mensajes de registro según la gravedad
    • Admite mensajes de registro internacionalizados
  • Si está utilizando Java, ahora se prefiere slf4j al registro de recursos comunes de Yakarta como la fachada de registro.

  • Como se indicó, slf4j es una fachada y, a continuación, debe elegir una implementación subyacente. Ya sea log4j, java.util.logging o ''simple''.

  • Siga los consejos de su marco para garantizar que las costosas operaciones de registro no se lleven a cabo innecesariamente


Iniciar sesión directamente en la consola es horrendo y, francamente, la marca de un desarrollador inexperto. La única razón para hacer este tipo de cosas es 1) él o ella no tiene conocimiento de otros enfoques, y / o 2) el desarrollador no ha pensado en lo que sucederá cuando su código se implemente en un sitio de producción, y cómo se mantendrá la aplicación en ese punto. Tratar con una aplicación que está registrando 1GB / día o más de registro de depuración completamente innecesario es enloquecedor.

La mejor práctica generalmente aceptada es usar un marco de registro que tenga conceptos de:

  1. Diferentes objetos de registro: diferentes clases / módulos / etc. pueden iniciar sesión en diferentes registradores, por lo que puede optar por aplicar diferentes configuraciones de registro a diferentes partes de la aplicación.
  2. Diferentes niveles de registro: para que pueda modificar la configuración de registro y registrar solo los errores en la producción, para registrar todo tipo de información de depuración y rastreo en un entorno de desarrollo, etc.
  3. Diferentes salidas de registro: el marco debería permitirle configurar dónde se envía la salida de registro sin requerir ningún cambio en la base de código. Algunos ejemplos de lugares diferentes a los que le gustaría enviar el resultado del registro son archivos, archivos que se transfieren en base a fecha / tamaño, bases de datos, correo electrónico, receptores remotos, etc.
  4. El marco de registro nunca debe arrojar Excepciones o errores desde el código de registro. Su aplicación no debería dejar de cargarse o no iniciarse porque el marco de trabajo de registro no puede crear su archivo de registro u obtener un bloqueo en el archivo (a menos que sea un requisito crítico, tal vez por razones legales, para su aplicación).

El marco de registro eventual que utilizará, por supuesto, dependerá de su plataforma. Algunas opciones comunes:


Además de las consideraciones técnicas de otras respuestas, es aconsejable registrar un mensaje significativo y quizás algunos pasos para evitar el error en el futuro. Dependiendo de los errores, por supuesto.

Podría obtener más de un error de E / S cuando el mensaje indique algo como "No se pudo leer desde el archivo X, no tiene el permiso correspondiente".

Vea más ejemplos en SO o busque en la web .