2010-02-04 46 views
5

我在log4j.xml中列出哪個記錄​​器來捕獲未處理的struts 2異常?Log4j Logger for Struts 2 Exception Interceptor

我在struts.xml中聲明下面的代碼:

<package name="default" extends="struts-default"> 
    <interceptor-stack name="defaultStack"> 
     <interceptor-ref name="timer"/> 
    <interceptor-ref name="logger"/> 
     <interceptor-ref name="exception"> 
      <param name="logEnabled">true</param> 
      <param name="logCategory">error.unhandled</param> 
      <param name="logLevel">WARN</param> 
     </interceptor-ref> 
    </interceptor-stack> 
</package> 

在我的log4j.xml文件,我有以下記錄聲明:

<appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender"> 
    <layout class="org.apache.log4j.PatternLayout"> 
     <param name="ConversionPattern" value="%p [%c] - %C{1}.%M(%L) | %m%n"/> 
    </layout> 
</appender> 
<logger name="error.unhandled"> 
    <level value="DEBUG"/> 
    <appender-ref ref="CONSOLE" /> 
</logger> 

然而,當Struts的拋出例外,它沒有被log4j正確記錄。我知道我的log4j.xml正在正確解析,因爲我可以用一個名爲「error.unhandled」的記錄器手動創建一個java類,並直接向它寫入ERROR級別的消息。一位同事還建議,我應該嘗試捕獲log4j.logger.error.unhandled記錄器,但這也不起作用。

Struts 2用於異常攔截器的記錄器是哪一種?

+0

你能手動記錄一些WARN級別的東西,並讓它出現在日誌中嗎? – skaffman 2010-02-04 20:49:18

+0

你要部署什麼類型的容器? (即Tomcat,JBoss,WebSphere) – 2010-02-04 22:57:37

回答

0

您在攔截器定義中使用日誌級WARN。將其更改爲ERROR,您將看到日誌消息,或者將log4j.xml文件中的日誌級別降低爲WARN,INFO或DEBUG。

換句話說,攔截器在WARN級別發出一條消息,控制檯appender收到該消息,但選擇不打印它,因爲它被配置爲僅在ERROR級別打印消息。

+0

我將錯誤級別降低到DEBUG,但它沒有幫助。任何其他想法? – David 2010-02-04 20:38:28

+0

struts使用commons logging,所以也許你的問題在別處。 commons-logging和log4j都配置正確嗎? – Yoni 2010-02-04 20:46:17

+0

我會在哪裏配置commons-logging?我只配置了log4j.xml – David 2010-02-04 20:57:31

0

您的記錄器log4.xml的閾值設置爲ERROR,因此記錄下的任何記錄都不會被記錄下來。您的struts配置設置爲WARN級別,該級別低於ERROR

您應該將log4j.xmllogger中的閾值降低爲WARN,以獲取任何內容。

+0

我把錯誤級別降低到DEBUG,但它沒有幫助。任何其他想法? – David 2010-02-04 20:37:31

4

你想要做的是爲默認攔截器堆棧中的異常攔截器提供參數。在發佈的示例中,您正在重新定義默認堆棧。

的解決方案是從官方的wiki採取:https://cwiki.apache.org/WW/exception-handling.html

使能由Struts 2框架正在處理的異常的日誌記錄,您必須在struts.xml中指定某些參數值。

<interceptors> 
    <interceptor-stack name="appDefaultStack"> 
    <interceptor-ref name="defaultStack"> 
    <param name="exception.logEnabled">true</param> 
    <param name="exception.logLevel">ERROR</param> 
    </interceptor-ref> 
</interceptor-stack> 
</interceptors> 

<default-interceptor-ref name="appDefaultStack" />