Ошибка при использовании Logback - PullRequest
0 голосов
/ 25 мая 2018

Я работаю на 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.

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

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

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

1 Ответ

0 голосов
/ 25 мая 2018

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

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

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

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

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

...