Cómo forzar el uso de log4j pero no slf4j
En mis dependencias de proyecto, tengo tanto slf4j
como log4j
. Por alguna razón técnica, esto no se puede cambiar.
> gradlew dependencies
Starting a Gradle Daemon, 1 incompatible and 1 stopped Daemons could not be reused, use --status for details
> Task :dependencies
.
.
| | | +--- org.springframework.boot:spring-boot-starter-logging:2.5.7
| | | | +--- ch.qos.logback:logback-classic:1.2.7
| | | | | +--- ch.qos.logback:logback-core:1.2.7
| | | | | \--- org.slf4j:slf4j-api:1.7.32
| | | | +--- org.apache.logging.log4j:log4j-to-slf4j:2.14.1
| | | | | +--- org.slf4j:slf4j-api:1.7.25 -> 1.7.32
| | | | | \--- org.apache.logging.log4j:log4j-api:2.14.1 -> 2.17.0
| | | | \--- org.slf4j:jul-to-slf4j:1.7.32
| | | | \--- org.slf4j:slf4j-api:1.7.32
.
.
+--- org.apache.logging.log4j:log4j-core:2.17.0
| \--- org.apache.logging.log4j:log4j-api:2.17.0
+--- org.apache.logging.log4j:log4j-api:2.17.0
BUILD SUCCESSFUL in 16s
1 actionable task: 1 executed
Quiero establecer el nivel de registro en el código, y según tengo entendido, esto solo se puede hacer con log4j
. Por lo tanto, simplemente busco una forma de hacer que esta línea de código (donde LogManager
es parte de log4j
) devuelva la implementación de log4j
y no la implementación de slf4j
:
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
.
.
private final Logger logger = LogManager.getLogger(getClass());
Lamentablemente, la clase del logger que devuelve es org.apache.logging.slf4j.SLF4JLogger
:
System.out.println("logger class is: [" + logger.getClass() + "]");
salida:
logger class is: [class org.apache.logging.slf4j.SLF4JLogger]
Aunque parece fácil, no he logrado hacerlo ni encontrar un ejemplo en línea. ¿Qué se puede hacer?
davy.ai
Dado que tu proyecto depende tanto de
slf4j
como delog4j
, esto significa que la API deslf4j
ya está siendo utilizada por otras bibliotecas y no puedes reemplazarla con la API delog4j
. Sin embargo, puedes configurarslf4j
para que utilicelog4j
como su sistema de registro subyacente.Aquí están los pasos para configurar
slf4j
para que utilicelog4j
:logback
(u otro marco de registro) del archivobuild.gradle
opom.xml
de tu proyecto.log4j-slf4j-impl
, que proporciona el enlace delog4j
paraslf4j
. Esta dependencia puede coexistir con otros marcos de registro, comologback
.log4j2.xml
al classpath de tu proyecto.Aquí tienes un ejemplo de configuración
log4j2.xml
:Esta configuración registra mensajes de nivel
debug
y superior en la consola, utilizando un patrón que incluye la hora, el nombre del hilo, el nivel de registro, el nombre del registrador y el mensaje.Una vez que hayas agregado la dependencia de
log4j-slf4j-impl
y el archivo de configuraciónlog4j2.xml
, puedes utilizar la API deslf4j
como de costumbre. Las declaraciones de registro pasarán porslf4j
, que las delegará alog4j
a través del enlace.Ten en cuenta que si tienes declaraciones de registro existentes que usan
slf4j
, seguirán funcionando con esta configuración, pero estarán utilizandolog4j
internamente. No necesitas cambiar ninguna de tus declaraciones de registro, pero puedes utilizar características específicas delog4j
, como establecer el nivel de registro, utilizando el objetoLogger
devuelto porLogManager.getLogger()
.