2011-12-29 10 views

Respuesta

4

slf4j es una API de registro, que no hace nada, solo un montón de interfaces. log4j es un sistema de registro, con clases concretas. hay una biblioteca slf4j-log4j que usa log4j como back-end para la API slf4j.

Algunos proyectos dependen explícitamente de log4j, llaman clases concretas. Por lo tanto, no puede usar otro back-end (por ejemplo, logback o j.u.l o apache commons o lo que sea) para su proyecto que sabiamente utilizó solo con la API slf4j.

Hay a trick para sustituir las clases log4j por una implementación simulada (el puente) que simplemente redirige todas las llamadas al sl4j. En Maven solo declaras una dependencia con un número de versión muy alto y esta simulación se considera una biblioteca log4j ultramoderna.

+0

por lo que en tiempo de ejecución utiliza la inyección de dependencia? todavía confundido lo siento. – codecompleting

+0

No, el experto ''. Tal vez no entiendo la pregunta? ¿Puedes aclararlo? – kan

27

Spring sigue usando commons-logging para todo el registro interno (compatibilidad con versiones anteriores). Si desea utilizar algún otro marco de trabajo de registro (log4j), entonces necesita puente las llamadas desde commons logging al marco de su elección. De lo contrario, deberá mantener múltiples configuraciones de registro.

slf4j actúa como una fachada simple para diversos marcos de registro (jul, log4j, jcl, logback) y le permite conectar en el marco de registro deseada durante el despliegue.

En lugar de utilizar la implementación del marco de registro que impone el marco de terceros, proporciona la implementación del puente slf4j's que funciona como algo real pero realmente solo reenvía las llamadas al slf4j o su enlace concreto.

sección Registro de Maven pom.xml por lo general es el siguiente:

<!-- remove the real commons-logging from classpath --> 
<!-- declare as provided or exclude from spring jars --> 
<dependency> 
    <artifactId>commons-logging</artifactId> 
    <groupId>commons-logging</groupId> 
    <version>1.0</version> 
    <scope>provided</scope> 
</dependency> 

<!-- add slf4j interfaces to classpath --> 
<dependency> 
    <groupId>org.slf4j</groupId> 
    <artifactId>slf4j-api</artifactId> 
    <version>1.6.4</version> 
    <scope>compile</scope> 
</dependency> 

<!-- add commons logging to slf4j bridge to classpath --> 
<!-- acts as jcl but routes commons-logging calls to slf4j --> 
<dependency> 
    <groupId>org.slf4j</groupId> 
    <artifactId>jcl-over-slf4j</artifactId> 
    <version>1.6.4</version> 
    <scope>runtime</scope> 
</dependency> 

<!-- add log4j binding to classpath --> 
<!-- routes slf4j calls to log4j --> 
<dependency> 
    <groupId>org.slf4j</groupId> 
    <artifactId>slf4j-log4j12</artifactId> 
    <version>1.6.4</version> 
    <scope>runtime</scope> 
</dependency> 

<!-- add log4j to classpath --> 
<!-- does the logging --> 
<dependency> 
    <groupId>log4j</groupId> 
    <artifactId>log4j</artifactId> 
    <version>1.2.16</version> 
</dependency> 

Esto no tiene nada que ver con el contenedor de primavera, ni la inyección de dependencias, es la ruta de clase pura, cosas cargador de clases ...

Consulte thefollowing enlaces para obtener más información.

+0

Si bien esta respuesta es bastante buena, hay una imprecisión en ella: SLF4J no está * puenteado * sobre el registro de commons, la dependencia 'jcl-over-slf4j' contiene una reimplementación de la API de registro de commons *. Por eso es fundamental asegurarse de que el registro de commons no se encuentre en su classpath, ya que los dos módulos usan el mismo nombre de paquete (como una necesidad) y, por lo tanto, entran en conflicto catastróficamente con cada uno de ellos. El módulo de "contexto" de Spring contiene una dependencia de "spring-core" que contiene una dependencia del "commons-logging", por lo que debe tomar medidas activas para evitar esto al usar Spring –

+0

. También es un poco más limpio excluir específicamente el dependencia en el inicio de sesión en Spring, que puede hacer como se describe en [este artículo en el sitio web de Spring] (https: // spring.io/blog/2009/12/04/logging-dependencies-in-spring), en lugar de decirle a Maven que ya lo tienes en tu classpath (que en realidad es un truco). –