2013-07-03 19 views
7

私はlogbackに問題があります。私はそれをセットアップして(Mavenを使用して)、すべてがうまくいくように見えますが、Logbackは設定ファイルを見つけることができないと報告します(しかし、デフォルトのロガー設定を使用してコンソールにログできます)。logback.xmlが存在するにもかかわらず、logback.xmlが見つかりません(クラスパス上)

[#| 2013-07-03T07:55:30.843 + 0200 | INFO | glassfish3.1.2 | javax.enterprise.system.std.com.sun.enterprise.server.logging | _ThreadID = 124; _ThreadName =スレッド2; | 07:54:39,844 | ch.qos.logback.classic.LoggerContextの-INFO [デフォルト] - リソース[logback.groovy]を見つけられませんでした

07:54:39,844 | -INFO in ch.qos.logback.classic.LoggerContext [デフォルト] - リソース[logback-test.xml]が見つかりませんでした

07:54:39,844 | -INFO in ch.qos.logback.classic.LoggerContext [デフォルト] - リソース[logback.xml]が見つかりませんでした

07:54:39,847 | ch.qos.logback.classic.LoggerContextの-INFO [デフォルト] - デフォルト設定を設定します。 |#]

私は(WARある)私のMavenアーティファクトのsrc/main/resourcesフォルダに(logback.xmlと呼ばれる)の設定ファイルを置きます。私はクラスパスから設定をロードしようとすると、 は興味深いことに、私は成功:

[#|2013-07-03T07:55:30.844+0200|INFO|glassfish3.1.2|javax.enterprise.system.std.com.sun.enterprise.server.logging|_ThreadID=124;_ThreadName=Thread-2;|<configuration> 
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 
     <!-- encoders are assigned the type 
      ch.qos.logback.classic.encoder.PatternLayoutEncoder by default --> 
     <encoder> 
      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> 
     </encoder> 
    </appender> 

    <root level="debug"> 
     <appender-ref ref="STDOUT" /> 
    </root> </configuration>|#] 

マイpom.xml持って次のエントリ:

 <dependency> 
      <groupId>ch.qos.logback</groupId> 
      <artifactId>logback-classic</artifactId> 
      <version>1.0.13</version> 
     </dependency> 

     <dependency> 
      <groupId>ch.qos.logback</groupId> 
      <artifactId>logback-core</artifactId> 
      <version>1.0.13</version> 
     </dependency> 

     <dependency> 
      <groupId>org.slf4j</groupId> 
      <artifactId>slf4j-api</artifactId> 
      <version>1.7.5</version> 
     </dependency> 

Reader r = new InputStreamReader(getClass().getClassLoader().getResourceAsStream("logback.xml")); 
StringWriter sw = new StringWriter(); 
char[] buffer = new char[1024]; 
for (int n; (n = r.read(buffer)) != -1;) 
    sw.write(buffer, 0, n); 
String str = sw.toString(); 
System.out.println(str); 

私のサンプル設定ファイルを印刷し、どの

WARファイル(EARファイル内)としてパッケージ化されています。 WARファイル内のlogback.xmlの場所は次のとおりです。WEB-INF/classes/logback.xml

セットアップに何が問題なのですか?あなたの助け

stupidSheep

+0

アプリケーションサーバからではなく、戦争からのログバックを使用していますか? –

答えて

5

WARファイル内の場所のための

多くのおかげで、WEB-INF/classes正しいです。

logback configuration documentationは、logback.xmlファイルが戦争の中でどこに置かれるかについて話しますが、EARについては何も言及していません。

このリンクの情報をお試しください。私はそれが特定の方法でEARに詰め込まれる必要があるかどうか疑問に思っています。

  1. Glassfish 3 + ear + logback.xml

(編集:第二リンクは削除、動作しませんでした)。

+0

はい、タイプミスでした(私は質問でそれを修正しました)。あなたの最初のリンク(Glassfish 3 + ear + logback.xml)で提案された解決策が働いた!どうもありがとう!新しいMavenモジュールを追加し、 "logback.xml"をsrc/main/resourcesフォルダに追加するだけでした。次に、新しく作成したmavenモジュールを、WARモジュールにコンパイル依存として追加する必要がありました。それはトリックでした! 2番目のリンクは私のためには機能しませんでした(MANIFEST.MFファイルを作成してクラスパスのエントリを追加したにもかかわらず、ログバックはまだ設定を見つけることができないと報告しました)。 もう一度ありがとうございます! – stupidSheep

+0

姉妹の羊を歓迎し、質問してくれてありがとう、私はlogback.xmlがEAR内のどこにあるべきか考えなかったので、今私も知っています:) – vikingsteve

3

Logbackはあなたの例では、コードに非常によく似たコードを呼び出し、すなわちのgetClassLoader()getResourceAsStream( "logback .xml ")。 logbackがlogback.xmlを見つけることができない場合は、そのリソースがlogbackクラスをロードしたクラスローダーから見えないようにする必要があります。このクラスローダーは、logback.xmlを見つけることができるテストコードをロードしたクラスローダーとはおそらく異なるでしょう。

+0

Hm、クラスローダの仕組みについてはあまりよく分かりません。しかし、両方の時間(起動時、展開後に1回)、コードはコンテナ(GlassFish 3)内で実行されました。かつてEARファイルのスタートアップ/デプロイメント中でした。アプリケーションがロードされた2回目(JSF @ManagedBeanによって、私がロガーを使用したのと同じクラスにあります)。とにかく、追加のjarファイルを使った回避策が働いた(受け入れられた回答を参照)。とにかくありがとう! – stupidSheep

関連する問題