No puedo decidir si usar slf4j o no con log4j2. Según las publicaciones en línea, no parece que tenga ningún impacto en el rendimiento, pero es realmente necesario.
Además, estos puntos gobiernan a favor de log4j2:
- SLF4J obliga a su aplicación a registrar cadenas. La API de Log4j 2 admite el registro de cualquier CharSequence si desea registrar texto, pero también admite el registro de cualquier Objeto tal cual.
- La API Log4j 2 ofrece soporte para el registro de objetos Message, expresiones lambda Java 8 y registro sin basura (evita la creación de matrices vararg y evita la creación de cadenas al registrar objetos CharSequence).
slf4j
logback (o log4jv1)? ¿Debería entonces verme obligado a instalar un tercer registrador para usar su aplicación? O tal vez la seguridad corporativa decide que solo puede usarjava.util.logging
en producción, ¿entonces qué?Respuestas:
Adelante: programe en la API log4j2 en lugar de slf4j
Es seguro: la API Log4j2 ofrece exactamente las mismas garantías que slf4j, y más.
Ahora que Log4j2 en sí está separado en una API y un módulo de implementación, ya no tiene ningún valor usar SLF4J.
Sí, es una buena práctica de ingeniería mantener abiertas sus opciones. Es posible que desee cambiar a otra implementación de registro más adelante.
Durante los últimos 10 años, construir tal flexibilidad en su aplicación significó usar una API contenedora como SLF4J. Sin embargo, esta flexibilidad no es gratuita: la desventaja de este enfoque es que su aplicación no puede usar el conjunto de características más completo de la biblioteca de registro subyacente.
Log4j2 ofrece una solución que no requiere que su aplicación esté restringida al mínimo común denominador.
La válvula de escape: log4j-to-slf4j
Log4j2 incluye un
log4j-to-slf4j
módulo puente. Cualquier aplicación codificada con la API de Log4j2 puede optar por cambiar la implementación de respaldo a cualquier implementación compatible con slf4j en cualquier momento.Como se menciona en la pregunta, el uso de la API Log4j2 ofrece directamente más funcionalidad y tiene algunas ventajas no funcionales en comparación con el uso de una API contenedora como slf4j:
(Consulte 10 funciones de API de Log4j2 no disponibles en SLF4J para obtener más detalles).
Las aplicaciones pueden utilizar de forma segura estas características enriquecidas de la API de Log4j2 sin estar bloqueadas en la implementación central nativa de Log4j2.
SLF4J sigue siendo su válvula de seguridad, simplemente no significa que su aplicación deba codificarse más con la API SLF4J.
Divulgación: contribuyo a Log4j2.
Actualización: Parece haber cierta confusión en cuanto a que la programación de la API de Log4j2 de alguna manera introduce una "fachada por fachada". No hay diferencia a este respecto entre la API de Log4j2 y SLF4J.
Ambas API requieren 2 dependencias cuando se usa una implementación nativa y 4 dependencias para una implementación no nativa. SLF4J y la API Log4j2 son idénticas a este respecto. Por ejemplo:
fuente
log4j-to-slf4j
dependencia en lugar delog4j-core
y elegir cualquiera de estas implementaciones de SLF4J que mencionaste. El número de implementaciones nativas de la API Log4j2 es irrelevante.