カスタムロギングシステムの開発に長時間を費やしました(上級者が決めたものです)。私はカスタムSLF4Jバインディング(API実装)を書くように求められました。 SLF4Jを利用している多くのコンポーネント(Apache Camelなど)が新しい自社製システムへのログ記録を開始するようにします。SLF4Jカスタムバインドが動作しない
- SLF4Jは
Loggers
とLoggerFactory
クラス - 使用されるロガーアダプタにバインドするために、実行時に使用しています
StaticLoggerBinder
:は、私が作成し、「T」にSLF4Jのサイト上の指示に従ってきました「フォワード」
- に(静的ロガーバインダーが使用)ロガー工場のコール
org.slf4j.Logger
から
イブライズは偉大なコンパイル。私はそれをひっくり返して、slf4j-api-1.6.2.jar
(私が使いたいバージョン)と共に、テストプロジェクトのlib
ディレクトリに追加します。私は両方のJARをEclipseのビルドパスに追加しました。
私はテストプロジェクトの新しい実行コンフィギュレーションを作成し、実行コンフィグレーションのClasspath
タブ区画の下にはUser Entries >> TestBinding >> Slf4jBinding.jar and slf4j-api-1.6.2.jar
があります。
したがって、両方のJARがRun Configurationのクラスパス内にあるようです。このようになりますプロジェクト内のドライバを実行する際
:
public static void main(String[] args) {
Logger logger = LoggerFactory.getLogger(TestDriver.class);
logger.error("Test");
}
私は、次のランタイムエラーを取得:
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.
は、その参照先サイトに行く、SLF4Jが私を見つけることができないようですクラスパス上のStaticLoggerBinder
は、Slf4jBinding.jar
の内部ですが、JARのルートレベルではありません。
私はSLF4JのLoggerFactory.java
ソースファイルを見て、この種のエラースローコードが見つかりました:明らかに
private final static void bind() {
try {
// the next line does the binding
StaticLoggerBinder.getSingleton();
INITIALIZATION_STATE = SUCCESSFUL_INITILIZATION;
emitSubstituteLoggerWarning();
} catch (NoClassDefFoundError ncde) {
String msg = ncde.getMessage();
if (messageContainsOrgSlf4jImplStaticLoggerBinder(msg)) {
INITIALIZATION_STATE = NOP_FALLBACK_INITILIZATION;
Util
.report("Failed to load class \"org.slf4j.impl.StaticLoggerBinder\".");
Util.report("Defaulting to no-operation (NOP) logger implementation");
Util.report("See " + NO_STATICLOGGERBINDER_URL
+ " for further details.");
} // ...
を、try
ブロック(StaticLoggerBinder.getSingleton()
)の上部の呼び出しがNoClassDefFoundError
を投げています。なぜか分からない。
これは単なるクラスパスの問題だと思うので、ここでコードを貼り付けないことにしました。私のコードがSLF4Jの拘束力のあるポリシーに正しく準拠しているかどうかは、この問題が解決されるまで不明です。
クラスパスを構成するためにEclipse内で行う必要がある追加ステップはありますか?私のSlf4jBinding.jar
は何らかの理由でそのルートの内部にStaticLoggerBinder
が必要ですか?私はここにアイデアがありません。前もって感謝します!
あなたのStaticLoggerBinderはorg.slf4j.impl.StaticLoggerBinderですか? –
「JARのルートレベルではないが、これはどういう意味ですか? jar内のクラスが '/ org/slf4j/impl/StaticLoggerBinder.class'になければなりません。サブフォルダ内にある場合、そのクラスは見つかりません。 – rsp