2010-02-04 48 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" />