Я работаю на 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.
У меня вопрос: почему я получаю эту ошибку и как я могу это решить?
ПРИМЕЧАНИЕ: Я ничего не нашел в Интернете, кроме этого другого ТАК вопрос, с которым он мог быть связан. Но это не было решено, и ни один из предложенных ответов не помог мне.
Заранее спасибо!
@ tony19 а где я могу найти то, что у меня в пути к классам? Я новичок в intellij
Я бы проверил вывод вашей консоли на наличие SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in... (это должно сказать вам, где находится дубликат SLF4J). Также попробуйте включить отладку, указав аргументы командной строки: -Dlogback.debug=true.
@ 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
Можете ли вы распечатать LoggerFactory.getILoggerFactory().getClass() (или увидеть его класс в отладчике), чтобы увидеть, какая структура ведения журнала фактически привязана?
@PeterCooperJr. , убедитесь, что результат: class org.slf4j.simple.SimpleLoggerFactory




SLF4J - это стандартизированный интерфейс для ведения журнала. Вы используете его API для ведения журнала и имеете привязка в пути к классам для фактической структуры ведения журнала, которую хотите использовать.
Если ваш LoggerFactory.getILoggerFactory() - это SimpleLoggerFactory, то вы используете привязку SimpleLogger. Вы говорите, что решили использовать Logback, но на самом деле вместо этого используете SLF4J SimpleLogger.
Чтобы использовать Logback, вам необходимо убедиться, что он находится в вашем пути к классам и что никакая другая привязка SLF4J не находится в вашем пути к классам. Поскольку вы используете Maven для управления своими зависимостями, вы можете запустить «mvn зависимость: дерево», чтобы увидеть список всех зависимостей и то, что вносят ваши зависимости. Это может помочь вам выяснить, какие еще привязки вы используете.
Библиотеки с хорошим поведением, предназначенные для использования с SLF4J, будут просто включать slf4j-api, поскольку привязка должна использоваться только основным приложением. Если у вас есть библиотека с плохим поведением, которая пытается использовать свою собственную привязку, вам может потребоваться использовать Maven для исключать этой привязки.
Кроме того, часто бывает полезно использовать разделы <dependencyManagement> в вашем POM, чтобы гарантировать, что все ваши зависимости используют одну и ту же версию slf4j-api и не пытаются включать их собственную отдельную версию, а также использовать правила bannedDependenciesплагин maven-enforcer, чтобы гарантировать, что вы не облажаетесь при внесении изменений в будущем и случайно включите в свой проект еще один фреймворк для ведения журнала.
Обычно это означает, что у вас есть еще один SLF4J в вашем пути к классам. groups.google.com/forum/#!topic/liftweb/QB_bMgsQBwU