Logback и Jboss 7 - не работают вместе? - PullRequest
38 голосов
/ 01 марта 2012

У меня любопытная проблема.У меня было это Java-приложение, которое ранее было развернуто в tomcat и с удовольствием использовало logback classic в качестве реализации slf4j.Теперь, когда мы попытались развернуть то же приложение на сервере jboss 7.1.final, оно даже не развернуло приложение, отображающее java.lang.ClassCastException: org.slf4j.impl.Slf4jLoggerFactory cannot be cast to ch.qos.logback.classic.LoggerContext Это некорректная строка кода

final LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();

Класс, который имеет егопружина впрыскивается, и это не удается - следовательно, все приложение не может быть развернуто.Кто-нибудь есть решение этого?Заранее спасибо

После просмотра этого сайта и других форумов я понял, что Jboss 7 поставляется в комплекте с собственной реализацией slf4j и реализует тот же интерфейс ILoggerFactory, что и LoggerContext при входе в систему.Наше приложение попыталось получить экземпляр того же самого, но сервер приложений навязывает свою собственную реализацию slf4j.

Я попытался изменить module.xml в jboss \ modules \ org \ slf4j \ impl \ main и указал на негоlogback jars.

<resources>
    <resource-root path="logback-classic-0.9.28.jar"/>
    <resource-root path="logback-core-0.9.28.jar"/>
</resources>

Теперь, когда я запускаю приложение, я получаю серьезную ошибку

Exception starting filter WicketFilter: java.lang.ClassCastException: ch.qos.logback.classic.LoggerContext cannot be cast to ch.qos.logback.classic.LoggerContext

Я сошел с ума.Любые специалисты по jboss и logback могут помочь?Заранее спасибо

Ответы [ 3 ]

58 голосов
/ 01 марта 2012

Вам необходимо исключить серверную версию slf4j из вашего развертывания.Создайте файл jboss-deployment-structure.xml и поместите его в каталог WARS META-INF или WEB-INF.

Содержимое файла должно выглядеть так:

7 голосов
/ 31 октября 2013

Если вы используете в своем приложении мосты для jul или jcl, их тоже следует исключить:

        <module name="org.slf4j" />
        <module name="org.slf4j.jcl-over-slf4j" />
        <module name="org.slf4j.impl" />
        <module name="org.jboss.logging.jul-to-slf4j-stub" />
3 голосов
/ 27 июня 2016

Есть альтернативный подход:

  • вы настроили протоколирование в вашей войне
  • вы получили все зависимости в вашей войне
  • вы ничего не настраиваете в директории сервера JBoss, даже дополнительные модули JBoss

Просто полностью отключите ведение журнала JBoss и полагайтесь на зависимости в вашей войне . Отредактируйте ваш jboss-deployment-structure.xml следующим образом:

<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0">
    <deployment>
        <exclusions>
            <module name="org.apache.commons.logging" />
            <module name="org.apache.log4j" />
            <module name="org.jboss.logging" />
            <module name="org.jboss.logging.jul-to-slf4j-stub" />
            <module name="org.jboss.logmanager" />
            <module name="org.jboss.logmanager.log4j" />
            <module name="org.slf4j" />
            <module name="org.slf4j.impl" />
            <module name="org.slf4j.jcl-over-slf4j" />
        </exclusions>
    </deployment>
</jboss-deployment-structure>

После развертывания приложения ведение журнала начальной загрузки (boot.log) продолжает работать, а server.log будет отображать ведение журнала развертывания. Но все ваше приложение регистрируется через ваш (в этом примере) slf4j + logback в вашей войне.

Обратите внимание, что вам не нужно запускать JBoss с -Dorg.jboss.logging.provider=slf4j, если вы укажете это, вам потребуется предоставить модули JBoss (обычно slf4j-api, logback-classic и logback-core), но это не стоит усилия, поскольку ведение журнала JBoss теперь используется только для начальной загрузки (boot.log) и для информации о развертывании (server.log).

Ссылки:
http://tinyapps.blogspot.com/2013/01/getting-logback-and-slf4j-to-work-in.html
https://stackoverflow.com/a/19695680/2587343

...