java - logger - Excepción lanzada al usar logback/slf4j
slf4j loggerfactory (7)
Estoy usando slf4j 1.6.2 api jar (también probé con 1.6.1) - la versión logback es 0.9.29 (núcleo y clásico). Estoy usando jdk1.6 en ubuntu. La excepción que recibí se copia a continuación.
Exception in thread "main" java.lang.NoSuchMethodError: org.slf4j.helpers.MessageFormatter.arrayFormat(Ljava/lang/String;[Ljava/lang/Object;)Lorg/slf4j/helpers/FormattingTuple;
at ch.qos.logback.classic.spi.LoggingEvent.<init>(LoggingEvent.java:112)
at ch.qos.logback.classic.Logger.buildLoggingEventAndAppend(Logger.java:471)
at ch.qos.logback.classic.Logger.filterAndLog_0_Or3Plus(Logger.java:427)
at ch.qos.logback.classic.Logger.info(Logger.java:631)
También recibo un mensaje quejándose de la discrepancia de enlace slf4j.
"SLF4J: The requested version 1.6 by your slf4j binding is not compatible with [1.5.5, 1.5.6, 1.5.7, 1.5.8, 1.5.9, 1.5.10, 1.5.11]"
Además, debe tener muchos tarros slf4j-api de versiones mencionadas en []. Intente mantener una versión única de slf4j-api y los correspondientes jarros slf4j-log4j compatibles en el classpath.
Mezclar diferentes versiones de tarros slf4j siempre será problemático
El NoSuchMethodError se debe al descubrimiento de Métodos con el mismo nombre más de una vez, probablemente provenientes de las diferentes versiones de los mismos tarros
Agregar las siguientes dependencias podría ayudar:
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.7</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jul-to-slf4j</artifactId>
<version>1.7.7</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>1.7.7</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>log4j-over-slf4j</artifactId>
<version>1.7.7</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-jdk14</artifactId>
<version>1.7.7</version>
</dependency>
Esto puede ser más "yo también", pero intentaré delinear una solución más completa. Mezclo un montón de software de diversas fuentes en mi producto. Encontré este problema primero con NiFi JARs, luego más recientemente con Cassandra JARs de nuevo. Ya había insistido en pom.xml que tengo la misma versión de slf4j en todas partes:
<slf4j.version>[1.7.25]</slf4j.version>
...
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>${slf4j.version}</version>
</dependency>
... (all the slf4j JARs I needed)
Entonces, le dije a Maven que quería a Cassandra sin lo que fuera que traía para slf4j:
<dependency>
<groupId>org.apache.cassandra</groupId>
<artifactId>cassandra-all</artifactId>
<version>${cassandra.version}</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
</exclusion>
</dependency>
Sin embargo, como usted, estaba recibiendo quejas de
Exception in thread "main" java.lang.NoSuchMethodError: org.slf4j.helpers.MessageFormatter.arrayFormat(Ljava/lang/String;[Ljava/lang/Object;)Lorg/slf4j/helpers/FormattingTuple;
at ch.qos.logback.classic.spi.LoggingEvent.<init>(LoggingEvent.java:112)
De la dependencia de mvn: árbol , descubrí que estaba obteniendo el logback 1.1.3, que no coincidía con lo que Cassandra aparentemente estaba usando (0.9-algo como tú). Por lo tanto, también excluí obtener logback al agregar estas exclusiones a slf4j ya existentes:
<dependency>
<groupId>org.apache.cassandra</groupId>
<artifactId>cassandra-all</artifactId>
<version>${cassandra.version}</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
</exclusion>
<exclusion>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
</exclusion>
<exclusion>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</exclusion>
</dependency>
... con lo cual, el problema que tenía y usted está informando aquí, se fue. Espero que esto ayude a alguien.
La versión slf4j-api no coincide con la del enlace:
Un enlace SLF4J designa un artefacto como slf4j-jdk14.jar o slf4j-log4j12.jar utilizado para enlazar slf4j a un marco de registro subyacente, por ejemplo, java.util.logging y, respectivamente, log4j.
La mezcla de diferentes versiones de slf4j-api.jar y SLF4J puede causar problemas. Por ejemplo, si está usando slf4j-api-1.7.2.jar, también debe usar slf4j-simple-1.7.2.jar, usar slf4j-simple-1.5.5.jar no funcionará.
NOTA Desde la perspectiva del cliente, todas las versiones de slf4j-api son compatibles. El código de cliente compilado con slf4j-api-N.jar funcionará perfectamente bien con slf4j-api-M.jar para cualquier N y M. Solo necesita asegurarse de que la versión de su enlace coincida con la de slf4j-api.jar. No tiene que preocuparse por la versión de slf4j-api.jar utilizada por una dependencia determinada en su proyecto. Siempre puedes usar cualquier versión de slf4j-api.jar, y siempre que la versión de slf4j-api.jar y su enlace coincida, deberías estar bien.
En el momento de la inicialización, si el SLF4J sospecha que puede haber un problema de discrepancia entre la versión API y la vinculación, se emitirá una advertencia sobre la discrepancia sospechada.
Obtenido de http://www.slf4j.org , espero que pueda ayudar.
Parece que la versión de slf4j-api.jar que está cargando la JVM tiene la versión 1.5.x. Seguramente tienes slf4j-api-1.5.x.jar en tu ruta de clase (además de slf4j-api-1.6.2.jar). Revisa tu camino de clase.
Tenía exactamente el mismo mensaje de error. Lo resolví excluyendo la dependencia org.apache.directory.server:apacheds-all
. De alguna manera ese jar anula org.slf4j.spi.LocationAwareLogger
Tenemos que alinear las versiones de slf4j-api y el enlace correspondiente, en mi caso estaba usando slf4j-log4j12, de acuerdo con la documentación de SLF4J:
http://www.slf4j.org/codes.html#version_mismatch
Reemplazo las versiones de ambas bibliotecas incluidas como dependencias transitivas, poniendo en mi pom esto:
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.1</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.1</version>
</dependency>
Espero que esto ayude a alguien.
Saludos cordiales,
Jaider