Получение исключения org.apache.logging.slf4j.SLF4JLoggerContext не может быть передан в org.apache.logging.log4j.core.LoggerContext
Мой код очень прост, используя apache-log4j-2.0.2:
import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.Logger;
public class Log4jtest {
static Logger log =Logger.getLogger(Log4jtest.class);
public static void main(String[] args) {
BasicConfigurator.configure();
log.debug("This is debug message");
}
}
Но я получаю исключение, например:
Exception in thread "main" java.lang.ExceptionInInitializerError
Caused by: java.lang.ClassCastException: org.apache.logging.slf4j.SLF4JLoggerContext cannot be cast to org.apache.logging.log4j.core.LoggerContext``
at org.apache.log4j.Logger.getLogger(Logger.java:41)
at Log4jtest.<clinit>(Log4jtest.java:11)
Почему исключение исходит из простой программы?
Ответы
Ответ 1
Удалить ниже jar из пути класса, и он должен исправить проблему -
log4j-to-slf4j-2.0.2.jar
log4j-to-slf4j-2.0.2-sources.jar
log4j-slf4j-impl-2.0.2.jar
log4j-slf4j-impl-2.0.2-sources.jar
Я смог реплицировать и исправлять проблему после загрузки apache-log4j-2.0.2 от http://www.apache.org/dyn/closer.cgi/logging/log4j/2.0.2/apache-log4j-2.0.2-bin.zip.
Ответ 2
Я использовал Maven. Я обнаружил, что объявление моих зависимостей log4j
/slf4j
вверху списка <dependencies>
(до Spring Boot, который использовал logback
) исправило проблему.
К чести @TheCodingFrog, добавление исключений в мои зависимости Spring Boot также решило проблему. Вот так:
<dependencies>
<dependency>
<groupId>...</groupId>
<artifactId>...</artifactId>
<exclusions>
<exclusion>
<groupId>log4j</groupId>
<artifactId>*</artifactId>
</exclusion>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>*</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
ПРИМЕЧАНИЕ. Если вас интересует, какой каркас журналирования фактически используется, возможно, есть одно важное отличие: метод @TheCodingFrog позволяет использовать slf4j
в качестве привязки logback
:
SLF4J: Actual binding is of type [ch.qos.logback.classic.util.ContextSelectorStaticBinder]
тогда как с помощью метода, который я использовал, использовались slf4j
/log4j
:
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
В случае, если кому-то интересно, я использовал следующие зависимости log4j
/slf4j
:
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.7</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.7</version>
</dependency>
Ответ 3
<dependencies>
<dependency>
<groupId>...</groupId>
<artifactId>...</artifactId>
<exclusions>
<exclusion>
<groupId>log4j</groupId>
<artifactId>*</artifactId>
</exclusion>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>*</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
это решит мою проблему, спасибо!