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

Dav*_*vid 5 java log4j struts2

我在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>
Run Code Online (Sandbox Code Playgroud)

在我的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>
Run Code Online (Sandbox Code Playgroud)

但是,当Struts抛出异常时,log4j没有正确记录它.我知道我的log4j.xml正在被正确解析,因为我可以手动创建一个带有名为"error.unhandled"的记录器的java类,并直接向它写入ERROR级别的消息.一位同事还建议我应该尝试捕获log4j.logger.error.unhandled记录器,但这也不起作用.

Struts 2使用哪个记录器用于异常拦截器?

小智 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" />
Run Code Online (Sandbox Code Playgroud)


Yon*_*oni 0

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

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