8

ビルド/パッケージ化する Web アプリケーションがたくさんあり、それらの共通ライブラリを共有したいと考えています。

ロギングに関しては、各アプリケーションに slf4j-api をバンドルしたいと考えていますが、実装はコンテナー (現在は tomcat) によって提供されるものと考えてください。

そのために、logback-classic と logback-core の 2 つの jar ファイルを $CATALINA\lib ディレクトリにコピーしました。

残念ながら、実行時に slf4j とその実装の間のバインディングが失敗し、次のエラー メッセージが表示されます。

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

私がなんとかそれを機能させる唯一の方法は、jarファイルをwarファイルにバンドルするときです。

何か案は?

4

3 に答える 3

8

これは期待どおりに機能しません。ロギングフレームワークは、多くの静的変数(別名グローバル変数)を使用します。

したがって、ロギング構成をロードするたびに、コンテナーにデプロイされているすべてのアプリケーションの構成が置き換えられます。これは通常、あなたが望むものではありません。

ログの実装をWARにバンドルして、Webコンテナが各Webアプリが独自のグローバル変数のセットを確実に取得できるようにします。

[編集]本当に同じログ構成ですべてのアプリを制御したい場合は、すべてのログクラスをコンテナーに移動する必要があります。これにはが含まれslf4jます。

ログ設定をJARに入れて、そこにも置くことを強くお勧めします。または、できるだけ少ないコード(Tomcatがロードするように)とlogback.xml

それ以外の場合、アプリケーションの開始順序によって、ログ構成を変更する必要があるポイントに到達したときにログがどのようになるかが決まります。

于 2010-11-23T16:02:49.487 に答える
1

尊敬しましたか

クラスパスに slf4j-nop.jar、slf4j-simple.jar、slf4j-log4j12.jar、slf4j-jdk14.jar、または logback-classic.jar の 1 つ (および 1 つだけ) を配置すると、問題が解決するはずです。

?

たとえば hibernate を使用すると、クラスパスに slf4j-log4j12.jar が導入される可能性があるため、クラスパスに複数の slf4j 実装が存在する可能性があります

私にとっては、slf4j と log4j で動作します

于 2010-11-23T16:17:07.747 に答える