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:
- API de mensajes
- Lambdas para registro perezoso
- Registra cualquier objeto en lugar de solo cadenas
- Sin basura: evite crear varargs o crear cadenas cuando sea posible
- CloseableThreadContext elimina automáticamente elementos del MDC cuando haya terminado con ellos
(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:
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é?