我在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使用哪个记录器用于异常拦截器?
答案 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
,以便获取任何内容。