用于Struts 2异常拦截器的Log4j Logger

时间:2010-02-04 20:10:55

标签: java struts2 log4j

我在log4j.xml中列出哪个记录​​器来捕获未处理的struts 2异常?

我在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使用哪个记录器用于异常拦截器?

3 个答案:

答案 0 :(得分:5)

您要做的是在默认拦截器堆栈中为异常拦截器提供参数。在发布的示例中,您正在重新定义默认堆栈。

解决方案来自官方维基: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" />

答案 1 :(得分:0)

您在拦截器定义中使用日志级别WARN。将其更改为ERROR,您将看到日志消息,或者在log4j.xml文件中将记录器级别降低为WARN,INFO或DEBUG。

换句话说,拦截器发送WARN级别的消息,控制台appender接收该消息但选择不打印它,因为它被配置为仅打印ERROR级别的消息。

答案 2 :(得分:0)

log4.xml中的记录器的阈值设置为ERROR,因此不会记录低于该级别的任何记录。您的struts配置设置为WARN级别的日志,低于ERROR

您可能应该将log4j.xml logger中的阈值降低到WARN,以便获取任何内容。