2012-01-14 7 views
3

カスタムロギングシステムの開発に長時間を費やしました(上級者が決めたものです)。私はカスタムSLF4Jバインディング(API実装)を書くように求められました。 SLF4Jを利用している多くのコンポーネント(Apache Camelなど)が新しい自社製システムへのログ記録を開始するようにします。SLF4Jカスタムバインドが動作しない

  • SLF4JはLoggersLoggerFactoryクラス
  • 使用されるロガーアダプタにバインドするために、実行時に使用しています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が必要ですか?私はここにアイデアがありません。前もって感謝します!

+1

あなたのStaticLoggerBinderはorg.slf4j.impl.StaticLoggerBinderですか? –

+2

「JARのルートレベルではないが、これはどういう意味ですか? jar内のクラスが '/ org/slf4j/impl/StaticLoggerBinder.class'になければなりません。サブフォルダ内にある場合、そのクラスは見つかりません。 – rsp

答えて

4

最初から完全に開始する代わりに、たとえばslf4j-simple.jarを必要に応じて追加します。すべてのバインディングコードはそこにあります。実際のロギングを行うコードを適合させるだけです。

4

あなたのjarにはorg.slf4j.impl.StaticLoggerBinderというカスタム実装が必要です。実装の完全修飾クラス名は正確にorg.slf4j.impl.StaticLoggerBinderである必要があります。スタティック・バインディングは、SLF4J APIをスタブ・バージョンorg.slf4j.impl.StaticLoggerBinderに対してコンパイルした後、実行時にクラス・ローダーがSLF4Jバインディングから実際のバージョンをロードします。 SLF4Jの各バインディングには、その特定のバインディングに適したクラスorg.slf4j.impl.StaticLoggerBinderの異なるバージョンがあります。

0

プロジェクトでorg.slf4j.implパッケージを作成し、http://javaeenotes.blogspot.com/2011/12/custom-slf4j-logger-adapter.htmlで説明したように、そのパッケージにStaticLoggerBinderというクラスを実装することができます(私はこれを行いました。

jarファイルをビルドする必要はないことに注意してください。クラスパスでorg.slf4j.impl.StaticLoggerBinderクラスにアクセスできるようにする必要があります(jarに入れることはできますが、必須ではありません)。

関連する問題