Marco de registro de Java - Java logging framework

Un marco de registro de Java es un paquete de registro de datos informáticos para la plataforma Java . Este artículo cubre los marcos de registro de uso general.

El registro se refiere al registro de actividad de una aplicación y es un problema común para los equipos de desarrollo. Los marcos de registro facilitan y estandarizan el proceso de registro para la plataforma Java. En particular, brindan flexibilidad al evitar la salida explícita a la consola (consulte el Apéndice a continuación). El lugar donde se escriben los registros se vuelve independiente del código y se puede personalizar en tiempo de ejecución.

Desafortunadamente, el JDK no incluía el registro en su versión original, por lo que cuando se agregó la API de Java Logging, varios otros marcos de registro se habían vuelto ampliamente utilizados, en particular Apache Commons Logging (también conocido como Java Commons Logging o JCL) y log4j . Esto generó problemas al integrar diferentes bibliotecas de terceros (JAR), cada una de las cuales usaba diferentes marcos de registro. Se desarrollaron marcos de registro conectables (envoltorios) para resolver este problema.

Resumen de funcionalidad

El registro generalmente se divide en tres partes principales: el registrador, el formateador y el adjunto (o controlador).

  • El registrador es responsable de capturar el mensaje que se registrará junto con ciertos metadatos y pasarlo al marco de registro.
  • Después de recibir el mensaje, el marco llama al formateador con el mensaje que lo formatea para la salida.
  • El marco luego entrega el mensaje formateado al Appender / Handler apropiado para su disposición. Esto puede incluir salida a una pantalla de consola, escribir en disco, agregar a una base de datos o generar un correo electrónico.

Los marcos de registro más simples, como el marco de registro de Object Guy , combinan el registrador y el appender. Esto simplifica la operación predeterminada, pero es menos configurable, especialmente si el proyecto se mueve entre entornos.

Registrador

Un registrador es un objeto que permite que la aplicación inicie sesión sin importar dónde se envíe / almacene la salida. La aplicación registra un mensaje pasando un objeto o un objeto y una excepción con un nivel de gravedad opcional al objeto del registrador con un nombre / identificador determinado.

Nombre

Un registrador tiene un nombre. El nombre suele estar estructurado jerárquicamente, con puntos (.) Que separan los niveles. Un esquema común es usar el nombre de la clase o paquete que realiza el registro. Tanto log4j como la API de registro de Java admiten la definición de controladores más altos en la jerarquía.

Por ejemplo, el registrador podría llamarse " com.sun.some.UsefulClass ". El controlador se puede definir para cualquiera de los siguientes:

  • com
  • com.sun
  • com.sun.some
  • com.sun.some.UsefulClass

Siempre que haya un controlador definido en algún lugar de esta pila, puede producirse un registro. Por ejemplo, un mensaje registrado en el com.sun.some.UsefulClass registrador puede ser escrito por el com.sun controlador. Normalmente, existe un controlador global que recibe y procesa los mensajes generados por cualquier registrador.

Nivel de severidad

El mensaje se registra en un cierto nivel. Los nombres de nivel común se copian de Apache Commons Logging (aunque la API de Java Logging define diferentes nombres de nivel):

Niveles comunes
Nivel Descripción
FATAL Errores graves que provocan la terminación prematura. Espere que sean visibles de inmediato en una consola de estado.
ERROR Otros errores de tiempo de ejecución o condiciones inesperadas. Espere que sean visibles de inmediato en una consola de estado.
ADVERTENCIA Uso de API obsoletas, mal uso de API, "casi" errores, otras situaciones de tiempo de ejecución que son indeseables o inesperadas, pero no necesariamente "incorrectas". Espere que sean visibles de inmediato en una consola de estado.
INFO Eventos interesantes en tiempo de ejecución (inicio / apagado). Espere que sean visibles de inmediato en una consola, así que sea conservador y manténgalo al mínimo.
DEPURAR información detallada sobre el flujo a través del sistema. Espere que estos se escriban solo en registros.
RASTRO Información más detallada. Espere que estos se escriban solo en registros.

El marco de registro mantiene el nivel de registro actual para cada registrador. El nivel de registro se puede configurar de forma más o menos restrictiva. Por ejemplo, si el nivel de registro se establece en "ADVERTENCIA", se registran todos los mensajes de ese nivel o superior: ERROR y FATAL.

Los niveles de gravedad se pueden asignar tanto a registradores como a agregadores. Ambos deben estar habilitados para un nivel de gravedad determinado para que se genere la salida. Por lo tanto, un registrador habilitado para la salida de depuración no generará salida si el controlador que recibe el mensaje no está habilitado para la depuración.

Filtros

Los filtros hacen que se ignore o registre un evento de registro. El filtro más utilizado es el nivel de registro documentado en la sección anterior. Los marcos de registro como Log4j 2 y SLF4J también proporcionan marcadores, que cuando se adjuntan a un evento de registro también se pueden utilizar para filtrar. Los filtros también se pueden usar para aceptar o denegar eventos de registro según las excepciones que se lanzan, los datos dentro del mensaje de registro, los datos en un ThreadLocal que se exponen a través de la API de registro o una variedad de otros métodos.

Formateadores, diseños o renderizadores

Un formateador es un objeto que formatea un objeto dado. Principalmente, esto consiste en tomar el objeto binario y convertirlo en una representación de cadena. Cada marco define un formato de salida predeterminado que se puede anular si se desea.

Anexos o manipuladores

Los agregadores escuchan mensajes en o por encima de un nivel mínimo de severidad especificado. El Appender toma el mensaje que se transmite y lo publica de forma adecuada. Las disposiciones de los mensajes incluyen:

  • mostrar en la consola
  • escribir en un archivo o syslog
  • anexar a una tabla de base de datos
  • distribuir a través de Java Messaging Services
  • enviar por correo electrónico
  • escribir en un enchufe
  • descartar en el "bit-bucket" (/ dev / null)

Comparación de características

Tabla 1 - Características
Marco de referencia Tipo Niveles de registro admitidos Anexos estándar Comentarios Costo / Licencia
Log4J Marco de registro FATAL ERROR WARN INFO DEBUG TRACE Demasiados para enumerar: consulte la documentación del anexo Ampliamente utilizado en muchos proyectos y plataformas. Log4j 1 fue declarado "End of Life" en 2015 y ha sido reemplazado por Log4j 2, que proporciona una API que se puede utilizar con otras implementaciones de registro, así como una implementación de esa API.
Licencia Apache, versión 2.0
API de registro de Java Marco de registro SEVERE WARNING INFO CONFIG FINE FINER FINEST La máquina virtual Java (JVM) predeterminada de Sun tiene lo siguiente: ConsoleHandler, FileHandler, SocketHandler, MemoryHandler Viene con el JRE
tinylog Marco de registro ERROR WARNING INFO DEBUG TRACE ConsoleWriter, FileWriter, LogcatWriter, JdbcWriter, RollingFileWriter, SharedFileWriter y null (descarta todas las entradas del registro) Licencia Apache, versión 2.0
Volver a iniciar sesión Marco de registro ERROR WARN INFO DEBUG TRACE Demasiados para enumerar: consulte Appender JavaDoc Desarrollado como reemplazo de log4j, con muchas mejoras. Utilizado por numerosos proyectos, normalmente detrás de slf4j, por ejemplo Akka , Apache Camel , Apache Cocoon , Artifactory , Gradle , Lift Framework , Play Framework , Scalatra , SonarQube , Spring Boot , ... LGPL , versión 2.1
Registro de Apache Commons (JCL) Envoltorio de registro FATAL ERROR WARN INFO DEBUG TRACE Depende del marco subyacente Ampliamente utilizado, a menudo junto con log4j Licencia Apache, versión 2.0
SLF4J Envoltorio de registro ERROR WARN INFO DEBUG TRACE Depende del marco subyacente, que se puede conectar. Proporciona compatibles API cuñas para JCL, JDK y los paquetes de registro de log4j. También puede utilizar cualquiera de ellos para generar resultados. De forma predeterminada, utiliza Logback para la salida si está disponible. Ampliamente utilizado en muchos proyectos y plataformas, frecuentemente con Logback como implementación. Licencia MIT

Consideraciones

JCL y Log4j son muy comunes simplemente porque han existido durante tanto tiempo y fueron las únicas opciones durante mucho tiempo. La flexibilidad de slf4j (utilizando Logback debajo) lo ha convertido en una opción popular.

SLF4J es un conjunto de envoltorios de registro (o shims) que le permiten imitar cualquiera de los otros marcos. Por lo tanto, se pueden incorporar varias bibliotecas de terceros en una aplicación, independientemente del marco de registro que cada uno haya elegido usar. Sin embargo, toda la salida del registro se genera de forma estándar, normalmente a través de Logback.

Log4j 2 proporciona tanto una API como una implementación. La API se puede enrutar a otras implementaciones de registro equivalentes a cómo funciona SLF4J. A diferencia de SLF4J, la API Log4j 2 registra objetos de mensaje en lugar de cadenas para una mayor flexibilidad y también admite expresiones Java Lambda.

JCL no es realmente un marco de registro, sino un contenedor para uno. Como tal, requiere un marco de registro debajo, aunque puede usar de forma predeterminada su propio SimpleLog registrador.

JCL, SLF4J y la API Log4j 2 son útiles cuando se desarrollan bibliotecas reutilizables que necesitan escribir en cualquier sistema de registro subyacente que esté utilizando la aplicación. Esto también proporciona flexibilidad en entornos heterogéneos donde es probable que cambie el marco de explotación forestal, aunque en la mayoría de los casos, una vez que se ha elegido un marco de explotación forestal, hay poca necesidad de cambiarlo durante la vida del proyecto. SLF4J y Log4j 2 se benefician de ser más nuevos y se basan en las lecciones aprendidas de los marcos anteriores. Además, JCL tiene problemas conocidos con los cargadores de clases al determinar qué biblioteca de registro debe encajar y que ahora ha reemplazado a JCL.

La API de registro de Java se proporciona con Java. Aunque la API está técnicamente separada de la implementación predeterminada proporcionada con Java, reemplazarla con una implementación alternativa puede ser un desafío, por lo que muchos desarrolladores confunden esta implementación con la API de registro de Java. La configuración se realiza solo mediante archivos externos que no se cambian fácilmente sobre la marcha (otros marcos admiten la configuración programática). La implementación predeterminada solo proporciona algunos manejadores y formateadores, lo que significa que la mayoría de los usuarios tendrán que escribir los suyos.

Ver también

Referencias

enlaces externos