2013-07-03 95 views
7

我有一個logback問題。我設置它(使用maven),除了Logback報告找不到配置文件(但我可以使用默認記錄器配置登錄到控制檯),一切似乎都很好。Logback找不到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 = Thread-2; | 07:54:39,844 | -INFO in ch.qos.logback.classic.LoggerContext [默認] - 找不到資源[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 [default] - 找不到資源[logback.xml]

07:54:39,847 | -INFO in ch.qos.logback.classic.LoggerContext [default] - 設置默認配置。 |#]

我把配置文件(稱爲logback.xml)到我的Maven構件的src/main/resources文件夾(這是一個WAR)。 有趣的是,如果我試圖從classpath中加載的配置,我成功了:

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); 

它打印我的示例配置文件:

[#|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> 

打包爲WAR文件(在EAR文件中)。 WAR文件中logback.xml的位置如下:WEB-INF/classes/logback.xml

有沒有人知道我的設置有什麼問題?

的幫助

stupidSheep

+0

你確定你是從戰爭中使用logback,而不是從應用服務器上使用? –

回答

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模塊中。這就是訣竅!第二個鏈接對我來說不起作用(儘管我創建了MANIFEST.MF文件並添加了類路徑條目,但logback仍然報告它無法找到配置。) Anway,非常感謝! – stupidSheep

+0

歡迎先生,並感謝您的問題,我從來沒有想過應該在一個EAR內的logback.xml位置,所以現在我也知道:) – vikingsteve

3

的logback調用非常相似的代碼的代碼在你的榜樣,即getClassLoader()的getResourceAsStream(「的logback .XML「)。如果logback無法找到logback.xml,那麼一定是該資源對加載該logback類的類加載器不可見。這個類加載器很可能與加載可以找到logback.xml的測試代碼的類加載器不同。

+0

嗯,我不太瞭解類加載器的工作方式。但是這兩次(一次在啓動過程中,一次在部署後)代碼在容器內部執行(GlassFish 3)。一次是在啓動/部署EAR文件的過程中,第二次加載應用程序時(通過JSF @ManagedBean - 在我使用記錄器的同一個類中)。 Anway,解決方法是使用額外的jar文件(請參閱接受的答案)。不管怎麼說,還是要謝謝你! – stupidSheep

相關問題