2011-05-25 84 views
2

我的日誌記錄配置與log4j存在問題。所有的日誌消息都按照預期顯示在root.log文件中,但stdout只顯示root.log的子集,儘管我將它配置爲相同。Log4j:日誌文件正確,但Stdout只顯示子集

編輯:準確地說,我錯過了a.b的所有消息。

編輯2:我不是絕對確定,但我認爲,從a.b.的一些消息。 (INFO和DEBUG)在標準輸出上被記錄,而另一些則沒有。可能是與線程相關的問題?例如。一些線程在做日誌記錄,有些不是?

以下是我的log4j.xml,是否最終出現錯誤?

<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd" > 

<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'> 
    <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender"> 
     <layout class="org.apache.log4j.PatternLayout"> 
      <param name="ConversionPattern" value="%d{HH:mm:ss,SSS} [%t] (%C:%L) %-5p - %m%n" /> 
     </layout> 
    </appender> 

    <appender name="FILE_ALL" class="org.apache.log4j.RollingFileAppender"> 
     <param name="File" value="${catalina.home}/logs/root.log"/> 
     <layout class="org.apache.log4j.PatternLayout"> 
      <param name="ConversionPattern" value="%d [%t] %-4r (%F:%L) %-5p %x - %m%n" /> 
     </layout> 
    </appender> 

    <logger name="a.b.master"> 
     <level value="DEBUG" /> 
     <appender-ref ref="CONSOLE" /> 
     <appender-ref ref="FILE_ALL" /> 
    </logger> 

    <logger name="a.b.master.orm.support.HibernateSessionFilter"> 
     <level value="INFO" /> 
     <appender-ref ref="CONSOLE" /> 
     <appender-ref ref="FILE_ALL" /> 
    </logger> 

    <logger name="a.b.master.aop.hibernate.OpenSessionInRequestInterceptor"> 
     <level value="info" /> 
     <appender-ref ref="CONSOLE" /> 
     <appender-ref ref="FILE_ALL" /> 
    </logger> 

    <root> 
     <level value="INFO"/> 
     <appender-ref ref="CONSOLE"/> 
     <appender-ref ref="FILE_ALL"/> 
    </root> 
</log4j:configuration> 

我正在使用Commons Logging作爲實現。

感謝您的幫助!

+1

在你a.b.master.aop.hibernate.OpenSessionInRequestInterceptor,你有<電平值=「信息」 />而不是信息 - 這可能是一個問題?否則:控制檯輸出中缺少哪些消息? – 2011-05-25 10:52:13

+0

好的,我會將信息更改爲INFO,但我認爲它不會造成巨大的差異。但感謝您的答案。我已經編輯了一些關於丟失消息 – Erik 2011-05-25 13:27:09

+0

的更多信息,只有logger.debug消息將流向控制檯。您使用的是來自記錄器的命令? – Jai 2011-05-25 14:06:53

回答

1

即使沒有問題,我也找到了解決方案。我向我的ConsoleAppender添加了一個參數,所有內容都打印到stderr。這現在起作用。我猜它是eclipse或log4j的問題,因爲如果我從終端(控制檯)啓動應用程序,我可以正確地看到所有日誌消息。

<appender name="console" class="org.apache.log4j.ConsoleAppender"> 
     <param name="Target" value="System.err" /> 
     <layout class="org.apache.log4j.PatternLayout"> 
      <param name="ConversionPattern" value="%d [%t] %-4r (%F:%L) %-5p %x - %m%n" /> 
     </layout> 
    </appender> 
1

您的配置與我的日誌非常類似,我的日誌被轉儲到控制檯和某個遠程主機。試試這個,看看它是否適合你: -

<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'> 
    <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender"> 
     ... 
    </appender> 

    <appender name="FILE_ALL" class="org.apache.log4j.RollingFileAppender"> 
     ... 
    </appender> 

    <logger name="a.b.master"> 
     <level value="debug" /> 
    </logger> 

    <logger name="a.b.master.orm.support.HibernateSessionFilter"> 
     <level value="info" /> 
    </logger> 

    <logger name="a.b.master.aop.hibernate.OpenSessionInRequestInterceptor"> 
     <level value="info" /> 
    </logger> 

    <root> 
     <priority value="info"/> 
     <appender-ref ref="CONSOLE"/> 
     <appender-ref ref="FILE_ALL"/> 
    </root> 
</log4j:configuration> 

我不認爲你需要在每一個A·B記錄器來定義appender-ref因爲它應該從根拿起附加器。另外,我使用priority而不是logger作爲根目錄。否則,你的配置看起來和我的相同,我可以正常工作。如果出於某種原因,這對您不起作用,我建議您從配置中刪除自定義的a.b記錄器,以查看是否能夠在控制檯中獲取a.b消息。另外,只是供參考,我相信你已經知道這一點,但如果你的根設置爲使用「信息」,那麼真的不需要將自定義的a.b記錄器設置爲「信息」。我通常會讓我的根「警告」,並讓我的自定義記錄器使用「調試」或「信息」覆蓋它。

+0

感謝您的提示。我嘗試過,但沒有成功... – Erik 2011-05-25 17:36:40