java - example - log4j vs logback
log4j mdc example (6)
Estamos usando log4j detrás de una envoltura selfmade. Planeamos usar muchas más características ahora.
¿Deberíamos actualizar a logback?
(Me refiero al marco no a una fachada como SLF4J)
¿Deberías? Sí .
¿Por qué? Log4J 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 arrojará 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 su propia fachada?)
En el mundo de la tala, hay Fachadas (como Apache Commons Logging, slf4j o incluso Log4j 2.0 API) e implementaciones (Log4j 1 + 2, java.util.logging, TinyLog, Logback).
Básicamente, debes reemplazar tu envoltorio selfmade con slf4j IF y solo SI no estás satisfecho con él por alguna razón. Si bien Apache Commons Logging en realidad no proporciona una API moderna, slf4j y la nueva fachada de Log4j 2 lo están proporcionando. Dado que un buen número de aplicaciones usan slf4j como un contenedor, podría tener sentido usar eso.
slf4j da un buen número de azúcar API, como este ejemplo de slf4j documentos:
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 está desarrollado por QOS, que también mantiene logback. Log4j 2.0 se hornea 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 para usar Log4j 2 directamente.
Tenga en cuenta:
En el pasado, log4j 1 no se mantenía activamente mientras Logback estaba. Pero hoy las cosas son diferentes. Log4j 2 se mantiene activamente y se libera en un horario casi regular. También incluye muchas características modernas y -imho- hace un par de cosas mejor que Logback. Esto a veces es solo una cuestión de gusto y debe sacar sus propias conclusiones.
Escribí una descripción general rápida 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 frameworks de registro. Pero la base del código es diferente; no comparte casi nada con Log4j 1 y cero con Logback. Esto condujo a algunas mejoras como, por ejemplo, Log4j 2 opera con bytestreams en lugar de Strings under the hood. Además, no pierde eventos durante la reconfiguración.
Log4j 2 puede iniciar sesión con mayor velocidad que otros frameworks que conozco: http://www.grobmeier.de/log4j-2-performance-close-to-insane-20072013.html
Y aún la comunidad de usuarios parece ser mucho más grande que los Logbacks: http://www.grobmeier.de/apache-log4j-is-the-leading-logging-framework-06082013.html
Todo eso, dijo que la mejor idea es elegir los marcos de registro que mejor se adapte a lo que desea lograr. No cambiaría un marco completo si deshabilitaba el inicio de sesión en el entorno de producción y simplemente realizaba el registro básico en mi aplicación. Sin embargo, si hace un poco más con el registro, simplemente mire las características proporcionadas por los frameworks y sus desarrolladores. Mientras recibes soporte comercial para Logback a través de QOS (escuché), actualmente no hay soporte comercial para Log4j 2. Por otro lado, si necesitas hacer un registro de auditoría y necesitas un alto rendimiento provisto por los appenders asincrónicos, tiene mucho sentido compruebe log4j 2.
Tenga en cuenta a pesar de toda la comodidad que proporcionan, las fachadas siempre comen un poco de rendimiento. Es posible que no lo afecte en absoluto, pero si tiene pocos recursos puede que necesite guardar todo lo que pueda tener.
Sin conocer mejor sus requisitos, es casi imposible dar una recomendación. Solo: no cambies solo porque mucha gente cambia. Cambia solo porque ves el valor de eso. Y la argumentación de que log4j está muerto ya no cuenta. Está vivo, y hace calor.
DESCARGO DE RESPONSABILIDAD: Actualmente soy VP, Apache Logging Services e involucrado en log4j también.
Logback implementa de forma nativa la API SLF4J. Esto significa que si está utilizando logback, en realidad está usando la API SLF4J. Teóricamente, podría usar los aspectos internos de la API de inicio de sesión directamente para el registro, pero eso es muy desaconsejable. Toda la documentación de inicio de sesión y los ejemplos en los registradores están escritos en términos de la API SLF4J.
Entonces, al usar logback, estarías realmente usando SLF4J y si por alguna razón quieres volver a iniciar sesión en log4j, puedes hacerlo en cuestión de minutos simplemente colocando slf4j-log4j12.jar en tu 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, deberán 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 archivos de configuración es mucho menor que el trabajo requerido para migrar llamadas de registrador diseminadas a través de todo el código fuente de su software y sus dependencias.
No responde exactamente su pregunta, pero si puede alejarse de su envoltorio hecho a sí mismo, entonces está Simple Logging Facade para Java (SLF4J) que Hibernate ha cambiado ahora (en lugar del registro de commons).
SLF4J no tiene ninguno de los problemas del cargador de clases ni las pérdidas de memoria observadas en 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.
Edición: Aplogies que no me había aclarado. Estaba sugiriendo usar SLF4J para aislarse de tener que hacer una elección difícil entre log4j o logback.
Proyecto maduro o proyecto incluso en las etapas de desarrollo probablemente pierda más que ganar de dicha actualización, en mi humilde opinión. El logback es ciertamente mucho más avanzado en una variedad de puntos, pero no hasta cierto punto para un reemplazo completo en un sistema en funcionamiento. Sin duda, 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 haya lanzado y se haya encontrado con el usuario final. Esto es muy subjetivo, deberías ver que te cueste a ti mismo.
Su decisión debe basarse en
- su necesidad real de estas "más características"; y
- su costo esperado de implementar el cambio.
Debes resistir la tentación 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é.