简体   繁体   English

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

[英]Log4j Logger for Struts 2 Exception Interceptor

Which logger do I list in my log4j.xml to trap unhandled struts 2 exceptions? 我应该在log4j.xml中列出哪个记录​​器来捕获未处理的struts 2异常?

I have the following code declared in my struts.xml: 我在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>

In my log4j.xml file, I have the following logger declared: 在我的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>

However, when Struts throws an exception, it is not properly logged by log4j. 但是,当Struts引发异常时,log4j不会正确记录该异常。 I know that my log4j.xml is being parsed correctly since I can manually create a java class with a logger called "error.unhandled" and write ERROR level messages directly to it. 我知道我的log4j.xml已正确解析,因为我可以使用名为“ error.unhandled”的记录器手动创建Java类,并直接向其中写入ERROR级别消息。 A colleague also suggested that I should try trapping the log4j.logger.error.unhandled logger but that did not work either. 一位同事还建议,我应该尝试捕获log4j.logger.error.unhandled记录器,但这也不起作用。

Which logger does Struts 2 use for the exception interceptor? Struts 2使用哪个记录器作为异常拦截器?

What you want to do is to provide parameters for exception interceptor in default interceptor stack. 您要做的是在默认拦截器堆栈中为异常拦截器提供参数。 In example posted in question you are redefining default stack. 在有问题的示例中,您正在重新定义默认堆栈。

Solution is taken from official wiki: https://cwiki.apache.org/WW/exception-handling.html 解决方案来自官方Wiki: https//cwiki.apache.org/WW/exception-handling.html

To enable logging of the exceptions being handled by the Struts 2 framework you must specify some parameter values in struts.xml. 要记录由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" />

You are using log level WARN in your interceptor definition. 您在拦截器定义中使用日志级别WARN。 Change that to ERROR and you'll see the log messages, or alternatively reduce the logger level to WARN, INFO or DEBUG in the log4j.xml file. 将其更改为ERROR,您将看到日志消息,或者在log4j.xml文件中将记录器级别降低为WARN,INFO或DEBUG。

In other words, the interceptor sends out a message at WARN level, the console appender receives that message but chooses not to print it because it is configured to print only messages at ERROR level. 换句话说,拦截器以WARN级别发送消息,控制台附加程序接收到该消息,但选择不打印它,因为它被配置为仅打印ERROR级别的消息。

Your logger in log4.xml has its threshold set to ERROR , so anything logged below that level will not be recorded. 您在log4.xml中的记录器的阈值设置为ERROR ,因此不会记录该级别以下的任何记录。 Your struts config is set to log at WARN level, which is below ERROR . 您的struts配置设置为WARN级别的日志,该级别低于ERROR

You should probably reduce the threshold in the log4j.xml logger to WARN , in order to get anything. 您可能应该将log4j.xml logger的阈值降低为WARN ,以获取任何信息。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM