web-dev-qa-db-ja.com

LogbackとJboss 7-一緒に動作しませんか?

私は奇妙な問題を抱えています。私はこれを持っていましたJava以前にTomcatにデプロイされていて、slf4j実装としてlogback classicをうまく使っていたアプリケーションです。今、同じアプリを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実装がバンドルされており、logbackのLoggerContextと同じILoggerFactoryインターフェースが実装されていることに気付きました。私たちのアプリケーションは同じインスタンスを取得しようとしましたが、アプリサーバーは独自のslf4j実装を課しています。

Jboss\modules\org\slf4j\impl\mainにあるmodule.xmlを変更して、logback jarを指すようにしました。

_<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のエキスパートがお手伝いできますか?前もって感謝します

38
Soumya

サーバーバージョンのslf4jをデプロイメントから除外する必要があります。 jboss-deployment-structure.xmlファイルを作成してWARSに配置しますMETA-INFまたはWEB-INFディレクトリ。

ファイルの内容は次のようになります。

<jboss-deployment-structure>
    <deployment>
        <!-- Exclusions allow you to prevent the server from automatically adding some dependencies     -->
        <exclusions>
            <module name="org.slf4j" />
            <module name="org.slf4j.impl" />
        </exclusions>
    </deployment>
</jboss-deployment-structure>
60

アプリで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" />
7
Torsten Krah

別のアプローチがあります:

  • 戦争でロギングを設定しました
  • あなたは戦争ですべての依存関係を得ました
  • 追加の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>

アプリをデプロイすると、bootstrapロギング(boot.log)は引き続き機能します。server.logにもデプロイメントロギングが表示されます。ただし、すべてのアプリケーションは(この例では)slf4j + logbackあなたの戦争。

JBossを-Dorg.jboss.logging.provider=slf4jで実行する必要はないことに注意してください。これを指定する場合、JBossモジュール(通常はslf4j-api、logback-classicおよびlogback-core)を提供する必要がありますが、努力する価値はありません。 、JBossロギングがbootstrap(boot.log)およびデプロイメント情報(server.log)にのみ使用されるようになったため。

参照:
http://tinyapps.blogspot.com/2013/01/getting-logback-and-slf4j-to-work-in.html
https://stackoverflow.com/a/19695680/258734