Ошибка при использовании Logback

Я работаю на TCP-сервере и пытаюсь добавить логирование. Я решил использовать Logback. Вот мой код:

final static Logger logger = LoggerFactory.getLogger(Ecmg.class);

public static void main(String[] args)
{
    new Ecmg(args);
}

public Ecmg(String[] args) {

    logger.info("Hello world.");

    System.setProperty(ContextInitializer.CONFIG_FILE_PROPERTY, "/src/main/resources/logback.xml");
    LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
    StatusPrinter.print(lc);

    waitForConnection();
}

К сожалению, я получаю следующий результат:

[main] INFO Ecmg - Hello world. 
Exception in thread "main" java.lang.ClassCastException: org.slf4j.simple.SimpleLoggerFactory cannot be cast to ch.qos.logback.classic.LoggerContext at Ecmg.<init>(Ecmg.java:41) at Ecmg.main(Ecmg.java:29) 
Process finished with exit code 1

Судя по всему, проблема в следующей строчке: LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();. Я написал это по руководству, и это должно сработать. Вот мой pom.xml:

<?xml version = "1.0" encoding = "UTF-8"?>
<project xmlns = "http://maven.apache.org/POM/4.0.0"
     xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>Server</groupId>
<artifactId>Server</artifactId>
<version>1.0-SNAPSHOT</version>



<dependencies>
    <dependency>
        <groupId>io.vertx</groupId>
        <artifactId>vertx-core</artifactId>
        <version>3.5.1</version>
    </dependency>
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.2.3</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.8.0-beta2</version>
    </dependency>
</dependencies>

Если это важно, я использую java 8 и Intellij 2018.1.

У меня вопрос: почему я получаю эту ошибку и как я могу это решить?

ПРИМЕЧАНИЕ: Я ничего не нашел в Интернете, кроме этого другого ТАК вопрос, с которым он мог быть связан. Но это не было решено, и ни один из предложенных ответов не помог мне.

Заранее спасибо!

Обычно это означает, что у вас есть еще один SLF4J в вашем пути к классам. groups.google.com/forum/#!topic/liftweb/QB_bMgsQBwU

tony19 25.05.2018 11:45

@ tony19 а где я могу найти то, что у меня в пути к классам? Я новичок в intellij

souki 25.05.2018 11:54

Я бы проверил вывод вашей консоли на наличие SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in... (это должно сказать вам, где находится дубликат SLF4J). Также попробуйте включить отладку, указав аргументы командной строки: -Dlogback.debug=true.

tony19 25.05.2018 11:57

@ tony19 К сожалению, вывод консоли: [main] INFO Ecmg - Hello world. Exception in thread "main" java.lang.ClassCastException: org.slf4j.simple.SimpleLoggerFactory cannot be cast to ch.qos.logback.classic.LoggerContext at Ecmg.<init>(Ecmg.java:41) at Ecmg.main(Ecmg.java:29) Process finished with exit code 1

souki 25.05.2018 13:48

Можете ли вы распечатать LoggerFactory.getILoggerFactory().getClass() (или увидеть его класс в отладчике), чтобы увидеть, какая структура ведения журнала фактически привязана?

user65839 25.05.2018 15:30

@PeterCooperJr. , убедитесь, что результат: class org.slf4j.simple.SimpleLoggerFactory

souki 25.05.2018 15:31
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
6
552
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

SLF4J - это стандартизированный интерфейс для ведения журнала. Вы используете его API для ведения журнала и имеете привязка в пути к классам для фактической структуры ведения журнала, которую хотите использовать.

Если ваш LoggerFactory.getILoggerFactory() - это SimpleLoggerFactory, то вы используете привязку SimpleLogger. Вы говорите, что решили использовать Logback, но на самом деле вместо этого используете SLF4J SimpleLogger.

Чтобы использовать Logback, вам необходимо убедиться, что он находится в вашем пути к классам и что никакая другая привязка SLF4J не находится в вашем пути к классам. Поскольку вы используете Maven для управления своими зависимостями, вы можете запустить «mvn зависимость: дерево», чтобы увидеть список всех зависимостей и то, что вносят ваши зависимости. Это может помочь вам выяснить, какие еще привязки вы используете.

Библиотеки с хорошим поведением, предназначенные для использования с SLF4J, будут просто включать slf4j-api, поскольку привязка должна использоваться только основным приложением. Если у вас есть библиотека с плохим поведением, которая пытается использовать свою собственную привязку, вам может потребоваться использовать Maven для исключать этой привязки.

Кроме того, часто бывает полезно использовать разделы <dependencyManagement> в вашем POM, чтобы гарантировать, что все ваши зависимости используют одну и ту же версию slf4j-api и не пытаются включать их собственную отдельную версию, а также использовать правила bannedDependenciesплагин maven-enforcer, чтобы гарантировать, что вы не облажаетесь при внесении изменений в будущем и случайно включите в свой проект еще один фреймворк для ведения журнала.

Другие вопросы по теме