example java logging log4j logback

java - example - log4j levels order



¿Deberían los nuevos proyectos usar logback en lugar de log4j? (7)

¿Deberían los nuevos proyectos usar logback en lugar de log4j como un marco de registro?

O con otras palabras: ''¿Logback es mejor que log4j (dejando el SLF4J-''feature'' de logback al lado)? ''


Creo que su decisión debería ser la misma que si decidiera usar log4j o Jakarta Commons Logging. ¿Está desarrollando una biblioteca que se incluirá en otras aplicaciones? Si es así, no parece justo forzar a los usuarios de su biblioteca a usar también su biblioteca de registro preferida.

Si la respuesta es no, simplemente iré con lo que es más fácil de agregar y con lo que se siente más cómodo. Parece que logback es tan extensible y confiable como log4j, así que si te sientes cómodo usándolo, adelante.


Debe usar SLF4J + Logback para iniciar sesión.

Proporciona funciones claras, como mensajes parametrizados y (a diferencia del registro de zonas comunes) un contexto de diagnóstico mapeado (MDC, javadoc , documentation ).

El uso de SLF4J hace que el inicio de sesión intercambiable sea bastante elegante.

Además, SLF4J admite la creación de puentes de otros marcos de registro para la implementación SLF4J real que utilizará, de modo que los eventos de registro de software de terceros se mostrarán en sus registros unificados, con la excepción de java.util.logging que no se puede puentear. de la misma manera que otros marcos de registro.

Bridging jul se explica en los javadocs de SLF4JBridgeHandler.

He tenido una muy buena experiencia usando la combinación SLF4J + Logback en varios proyectos y el desarrollo de LOG4J se ha estancado.

SLF4J tiene los siguientes inconvenientes restantes:

  • No es compatible con varargs para mantenerse compatible con Java <1.5
  • No es compatible con el uso de mensajes parametrizados y una excepción al mismo tiempo.
  • No contiene soporte para un contexto de diagnóstico anidado (NDC, javadoc ) que tiene LOG4J.

El autor (tanto de Logback como de Log4j) tiene una lista de razones para cambiar en http://logback.qos.ch/reasonsToSwitch.html .

Aquí hay algunos que sobresalieron en mí;

  • Implementación más rápida

    En base a nuestro trabajo anterior en log4j, las partes internas de logback se han vuelto a escribir para que sean unas diez veces más rápidas en ciertas rutas de ejecución críticas. Los componentes de logback no solo son más rápidos, también tienen una huella de memoria más pequeña.

  • Recarga automática de archivos de configuración

    Logback-classic puede volver a cargar automáticamente su archivo de configuración después de la modificación. El proceso de escaneo es rápido y seguro ya que no implica la creación de un hilo separado para escanear. Esta sutileza técnica garantiza que el logback se reproduzca bien dentro de los servidores de aplicaciones y, en general, dentro del entorno JEE.

  • Rastreos de pilas con datos de embalaje

    Cuando logback imprime una excepción, el seguimiento de la pila incluirá datos de empaquetado. Aquí hay un rastro de pila de muestra generado por la aplicación web logback-demo.

    14: 28: 48.835 [btpool0-7] INFO cqldemo.prime.PrimeAction - 99 no es un valor válido java.lang.Exception: 99 no es válido
    en ch.qos.logback.demo.prime.PrimeAction.execute (PrimeAction.java:28) [classes /: na] en org.apache.struts.action.RequestProcessor.processActionPerform (RequestProcessor.java:431) [struts-1.2 .9.jar: 1.2.9] en org.apache.struts.action.RequestProcessor.process (RequestProcessor.java:236) [struts-1.2.9.jar: 1.2.9] en org.apache.struts.action. ActionServlet.doPost (ActionServlet.java:432) [struts-1.2.9.jar: 1.2.9] en javax.servlet.http.HttpServlet.service (HttpServlet.java:820) [servlet-api-2.5-6.1.12 .jar: 6.1.12]
    en org.mortbay.jetty.servlet.ServletHolder.handle (ServletHolder.java:502) [embarcadero-6.1.12.jar: 6.1.12] en ch.qos.logback.demo.UserServletFilter.doFilter (UserServletFilter.java:44 ) [classes /: na] en org.mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter (ServletHandler.java:1115) [embarcadero-6.1.12.jar: 6.1.12] en org.mortbay.jetty.servlet. ServletHandler.handle (ServletHandler.java:361) [embarcadero-6.1.12.jar: 6.1.12] en org.mortbay.jetty.webapp.WebAppContext.handle (WebAppContext.java:417) [embarcadero-6.1.12.jar : 6.1.12] en org.mortbay.jetty.handler.ContextHandlerCollection.handle (ContextHandlerCollection.java:230) [embarcadero-6.1.12.jar: 6.1.12]

    De lo anterior, puede reconocer que la aplicación está utilizando Struts versión 1.2.9 y se implementó en la versión de embarcadero 6.1.12. Por lo tanto, los rastreos de pila informarán rápidamente al lector sobre las clases que entran en la excepción, pero también sobre las versiones de paquetes y paquetes a las que pertenecen. Cuando sus clientes le envían un seguimiento de la pila, como desarrollador ya no tendrá que pedirles que le envíen información sobre las versiones de los paquetes que están utilizando. La información será parte del seguimiento de la pila. Consulte la palabra de conversión "% xThrowable" para más detalles.

    Esta característica puede ser bastante útil hasta el punto de que algunos usuarios la consideran erróneamente una característica de su IDE.

  • Eliminación automática de archivos de registro antiguos

    Al establecer la propiedad maxHistory de TimeBasedRollingPolicy o SizeAndTimeBasedFNATP, puede controlar la cantidad máxima de archivos archivados. Si su nueva política exige una renovación mensual y desea conservar los registros de un año, simplemente establezca la propiedad maxHistory en 12. Los archivos de registro archivados anteriores a 12 meses se eliminarán automáticamente.

Puede haber un sesgo allí, pero el mismo tipo escribió ambos frameworks y si dice usar Logback sobre Log4j probablemente valga la pena escucharlo.


Logback más consciente de Java EE:
en general (del código a la documentación) se tienen en cuenta los contenedores: cómo coexisten varias aplicaciones, cómo se implementan los cargadores de clases, etc. Contextos para registradores, JNDI, configuración JMX incluida, etc.

del desarrollador prospectivo casi lo mismo, Logback agrega el registro parametrizado (no es necesario usar if (logger.isDebugEnabled ()) para evitar la sobrecarga de concatenación de cadenas

Log4j: solo el gigante plus es soporte antiguo de JVM, pequeño (IMO) NDC (solo MDC de respaldo), algunas extensiones. Por ejemplo, escribí la extensión para configureAndWatch para Log4j, no existe tal cosa para Logback


No estoy familiarizado con SLF4J, y solo he echado un vistazo breve al logback, pero me vienen a la mente dos cosas.

Primero, ¿por qué excluyes una herramienta del examen? Creo que es importante mantener la mente abierta y examinar todas las posibilidades para elegir la mejor.

En segundo lugar, creo que en algunos proyectos, una herramienta es mejor que otra, y lo contrario podría ser cierto en un proyecto diferente. No creo que una herramienta sea siempre mejor que otra herramienta. Después de todo, no hay una bala de plata .

Para responder a su pregunta, sí y no. Depende del proyecto y de cuán familiarizado está el equipo con una herramienta. No diría "no use log4j" si todo el equipo está muy cómodo con él, cumple con todas las necesidades y logback no ofrece nada de lo que necesitamos para completar la tarea.


Usaría slf4j para iniciar sesión en todos los casos. Esto le permite elegir qué back-end de registro real desea usar, en tiempo de implementación en lugar de tiempo de código.

Esto ha demostrado ser muy valioso para mí. Me permite usar log4j en las antiguas JVM, y logback en más de 1.5 JVM, y también java.util.logging si es necesario.


el log4j y el logback originales fueron diseñados e implementados por el mismo tipo.

varias herramientas de código abierto han utilizado SLF4J. No veo ninguna deficiencia significativa en esta herramienta. Así que a menos que tenga muchas extensiones para log4j en su base de código, continuaría con logback.