log4j vs logback [cerrado]

152

Estamos usando log4j detrás de un envoltorio hecho a sí mismo. Tenemos la intención de utilizar muchas más características de la misma ahora.

¿Deberíamos actualizar al inicio de sesión?

(Quiero decir, el marco no es una fachada como SLF4J)

Jonik
fuente
1
el inicio de sesión suena muy similar al registro de Yakarta commons: ¿cuáles son las principales diferencias?
mate b
12
SLF4J (que es la fachada) suena similar a commons.logging. La principal diferencia es que SLF4J está usando el enlace estático mientras que commons.logging está usando alguna estrategia de resolución. Logback (la implementación "nativa" (es decir, no hay capa de envoltura adicional) de la fachada) es comparable a LOG4J pero tiene una API más rica.
Huxi

Respuestas:

190

Logback implementa de forma nativa la API SLF4J. Esto significa que si está utilizando el inicio de sesión, en realidad está utilizando la API SLF4J. Teóricamente, podría usar los componentes internos de la API de logback directamente para el registro, pero eso es altamente desaconsejado. Toda la documentación y ejemplos de registro en los registradores están escritos en términos de la API SLF4J.

Entonces, al usar logback, en realidad estaría usando SLF4J y si por alguna razón quisiera volver a log4j, podría hacerlo en minutos simplemente soltando slf4j-log4j12.jar en su ruta de clase.

Al migrar de logback a log4j, las partes específicas de logback, específicamente las contenidas en el archivo de configuración logback.xml , aún tendrían que migrarse a su equivalente log4j, es decir, log4j.properties . Al migrar en la otra dirección, la configuración de log4j, es decir , log4j.properties , debería convertirse a su equivalente de logback. Hay una herramienta en línea para eso. La cantidad de trabajo involucrado en la migración de los archivos de configuración es mucho menor que el trabajo requerido para migrar las llamadas del registrador distribuidas en todo el código fuente de su software y sus dependencias.

Ceki
fuente
28
Es una oportunidad única para hablar con el desarrollador de un software tan popular. Gracias Ceki por log4j.
Srujan Kumar Gulla
77
Descargo de responsabilidad: este chico es el desarrollador original de todos los Log4j, SLF4J y Logback. Pero ya no funciona para Log4j.
Victor Stafusa
56

Deberías .

¿Por qué? Log4J esencialmente ha sido desaprobado por Logback .

¿Es urgente? Tal vez no.

¿Es indoloro? Probablemente, pero puede depender de sus declaraciones de registro.

Tenga en cuenta que si realmente desea aprovechar al máximo LogBack (o SLF4J), entonces realmente necesita escribir declaraciones de registro adecuadas . Esto generará ventajas como un código más rápido debido a la evaluación perezosa y menos líneas de código porque puede evitar guardias.

Finalmente, recomiendo SLF4J. (¿Por qué recrear la rueda con tu propia fachada?)

AWhitford
fuente
48
Nota: El proyecto log4j no considera que log4j esté en desuso.
Thorbjørn Ravn Andersen
17
La terminología debe aclararse; inequívocamente, el autor del proyecto log4j considera que logback es el sucesor de log4j. Es el mismo autor de ambos proyectos, por lo que su opinión debería tener cierto peso; el "proyecto log4j" en sí mismo realmente no "considera" nada. El grupo actual de personas asociadas con log4j tiene opiniones divergentes (algunas realmente están de acuerdo, algunas sorprendentemente no están de acuerdo). Con un poco más de historia detrás de nosotros (3 años después del comentario original), SLF4J + Logback continúa ganando terreno sobre Log4j.
michael
@michael_n Tenga en cuenta que Log4j 1 NO fue escrito por una sola persona. Está mal decir el "mismo autor". Ceki es un autor importante, sin duda, pero no el único. De hecho, mucha gente ayudó a hacer de Log4j 1 lo que es.
Christian
@Christian "NO fue escrito ...", por supuesto, eso debería estar implícito para cualquier proyecto apache maduro (y mi calificación, "el grupo actual de personas asociadas con log4j"); no obstante, si pudiera editar el comentario, diría " originalmente escrito", como también dice el artículo de wikipedia. Re: "De hecho, mucha gente ayudó a hacer Log4j 1 lo que es" , eso es absolutamente, equívocamente cierto (es decir, para bien o para mal); y también, de alguna manera, contribuyó al inicio de slf4j + logback :-)
michael
3
Entonces, ¿qué hay en esto para que todos peleen por esta o aquella biblioteca de registro? ¿Por qué estamos tratando de matar / promover bibliotecas? Al menos proporcione un razonamiento racional POR QUÉ uno es mejor que el otro. Dios, Stack Overflow es un desastre.
Usuario
48

En el mundo de registro hay fachadas (como Apache Commons Logging, slf4j o incluso la API Log4j 2.0) e implementaciones (Log4j 1 + 2, java.util.logging, TinyLog, Logback).

Básicamente, debe reemplazar su envoltorio hecho a sí mismo con slf4j SI y solo SI no está satisfecho con él por alguna razón. Si bien Apache Commons Logging no proporciona realmente una API moderna, slf4j y la nueva fachada Log4j 2 sí lo están proporcionando. Dado que muchas aplicaciones usan slf4j como envoltorio, podría tener sentido usar eso.

slf4j da una cantidad de azúcar API agradable, como este ejemplo de documentos slf4j:

logger.debug("Temperature set to {}. Old temperature was {}.", t, oldT);

Es una sustitución variable. Esto también es compatible con Log4j 2.

Sin embargo, debe tener en cuenta que slf4j es desarrollado por QOS que también mantiene el inicio de sesión. Log4j 2.0 está horneado en la Apache Software Foundation. En los últimos tres años, una comunidad vibrante y activa ha crecido allí nuevamente. Si aprecia Open Source como lo hace Apache Software Foundation con todas sus garantías, puede reconsiderar el uso de slf4j a favor de usar Log4j 2 directamente.

Tenga en cuenta:

En el pasado, log4j 1 no se mantenía activamente mientras que Logback sí. Pero hoy las cosas son diferentes. Log4j 2 se mantiene activamente y se lanza en un horario casi regular. También incluye muchas características modernas y -imho- hace un par de cosas mejores que Logback. Esto a veces es solo una cuestión de gustos y debes sacar tus propias conclusiones.

Escribí un resumen rápido sobre las nuevas características de Log4j 2.0: http://www.grobmeier.de/the-new-log4j-2-0-05122012.html

Al leer, verá que Log4j 2 se inspiró en Logback pero también en otros marcos de registro. Pero la base del código es diferente; no comparte casi nada con Log4j 1 y cero con Logback. Esto conduce a algunas mejoras como, por ejemplo, Log4j 2 funciona con bytestreams en lugar de cadenas debajo del capó. Además, no pierde eventos durante la reconfiguración.

Log4j 2 puede iniciar sesión con mayor velocidad que otros marcos que conozco: http://www.grobmeier.de/log4j-2-performance-close-to-insane-20072013.html

Y aún así, la comunidad de usuarios parece ser mucho más grande que Logbacks: http://www.grobmeier.de/apache-log4j-is-the-leading-logging-framework-06082013.html

Dicho todo esto, la mejor idea es que elija los marcos de registro que mejor se adapten a lo que desea lograr. No cambiaría un marco completo si deshabilitara el inicio de sesión en el entorno de producción y solo realizara el inicio de sesión básico en mi aplicación. Sin embargo, si hace un poco más con el registro, solo mire las características que proporcionan los marcos y sus desarrolladores. Si bien obtiene soporte comercial para Logback a través de QOS (escuché) actualmente no hay soporte comercial para Log4j 2. Por otro lado, si necesita hacer un registro de auditoría y necesita un alto rendimiento proporcionado por los anexos asíncronos, tiene mucho sentido verifique log4j 2.

Tenga en cuenta que a pesar de toda la comodidad que brindan, las fachadas siempre comen un poco de rendimiento. Tal vez no te esté afectando en absoluto, pero si tienes pocos recursos, es posible que necesites guardar todo lo que puedas tener.

Sin conocer mejor sus requisitos, es casi imposible dar una recomendación. Simplemente: no cambies solo porque mucha gente cambia. Cambie solo porque vea su valor. Y la argumentación de que log4j está muerto ya no cuenta. Está vivo y hace calor.

DESCARGO DE RESPONSABILIDAD: Actualmente soy vicepresidente de Apache Logging Services y también participo en log4j.

cristiano
fuente
19

No responde exactamente a su pregunta, pero si puede alejarse de su envoltorio hecho a sí mismo, entonces existe la Fachada de registro simple para Java (SLF4J) a la que Hibernate ahora ha cambiado (en lugar del registro común).

SLF4J no sufre ninguno de los problemas del cargador de clases o las pérdidas de memoria observadas con Jakarta Commons Logging (JCL).

SLF4J admite el registro JDK, log4j y logback. Entonces, debería ser bastante fácil cambiar de log4j a logback cuando sea el momento adecuado.

Editar: disculpas que no me había dejado claro. Estaba sugiriendo usar SLF4J para aislarse de tener que tomar una decisión difícil entre log4j o logback.

kit de herramientas
fuente
3
Sé SLF4J. ¡Pero pedí el marco de registro no para la fachada!
44
Disculpas Lo que sugería era que si usaba SLF4J en lugar de su propia fachada personalizada, cambiar de log4j a logback sería menos doloroso.
kit de herramientas
¿Cuál es la fuente de esa cita? El registro de Commons es un componente probado y probado. Nunca he tenido pérdidas de memoria con eso.
Kshitiz Sharma
1
@KshitizSharma - desde el enlace de documentación SLF4J que proporcioné: slf4j.org/manual.html
toolkit
13

Su decisión debe basarse en

  • su necesidad real de estas "más funciones"; y
  • Su costo esperado de implementar el cambio.

Debe resistir el impulso de cambiar las API solo porque es "más nuevo, más brillante, mejor". Sigo una política de "si no está roto, no lo patees".

Si su aplicación requiere un marco de registro muy sofisticado, es posible que desee considerar por qué.

Carl Smotricz
fuente
3

Un proyecto maduro o incluso un proyecto profundo en las etapas de desarrollo probablemente perdería más que ganar con dicha actualización, en mi humilde opinión. El inicio de sesión es ciertamente mucho más avanzado en una variedad de puntos, pero no hasta cierto punto para el reemplazo completo en un sistema de trabajo. Ciertamente consideraría el inicio de sesión para un nuevo desarrollo, pero el log4j existente es lo suficientemente bueno y maduro para todo lo que ya se lanzó y se encontró con el usuario final. Esto es muy subjetivo, deberías ver que te cuesta.

Dima
fuente