Logging 当struts 2操作类中发生错误时,Log4j未记录
在Struts 2应用程序中,发生错误时没有stacktrace。为了在我的action类中测试这一点,我创建了一个null对象,并尝试对其调用一个方法。Struts 2过滤器向我显示了错误屏幕,因此Excepion映射是正确的,但在日志文件中我什么都没有。获取内容的唯一方法是在catch语句中添加带有log.error(e)的try/catch struts.xml:Logging 当struts 2操作类中发生错误时,Log4j未记录,logging,struts2,Logging,Struts2,在Struts 2应用程序中,发生错误时没有stacktrace。为了在我的action类中测试这一点,我创建了一个null对象,并尝试对其调用一个方法。Struts 2过滤器向我显示了错误屏幕,因此Excepion映射是正确的,但在日志文件中我什么都没有。获取内容的唯一方法是在catch语句中添加带有log.error(e)的try/catch struts.xml: <interceptors> <interceptor name="authz" c
<interceptors>
<interceptor name="authz" class="com.omb.controller.security.AuthzInterceptor"/>
<interceptor name="params-filter" class="com.opensymphony.xwork2.interceptor.ParameterFilterInterceptor"/>
<interceptor name="user" class="com.omb.controller.interceptor.UserInterceptor"/>
<interceptor-stack name="defaultStack">
<interceptor-ref name="exception">
<param name="exception.logEnabled">true</param>
<param name="exception.logLevel">ERROR</param>
</interceptor-ref>
<interceptor-ref name="alias"/>
<interceptor-ref name="servletConfig"/>
<interceptor-ref name="i18n"/>
<interceptor-ref name="chain"/>
<interceptor-ref name="modelDriven"/>
<interceptor-ref name="fileUpload"/>
<interceptor-ref name="staticParams"/>
<interceptor-ref name="conversionError"/>
<interceptor-ref name="params"/>
<interceptor-ref name="authz"/>
<interceptor-ref name="user"/>
<interceptor-ref name="prepare"/>
<interceptor-ref name="validation"/>
<interceptor-ref name="workflow"/>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="defaultStack"/>
<global-results>
<result name="technicalError" type="chain">errorAction</result>
<result name="sessionInvalidError" type="tiles">sessionInvalid</result>
<result name="blank" type="tiles">blank</result>
</global-results>
<global-exception-mappings>
<exception-mapping exception="java.lang.Exception" result="technicalError"/>
<exception-mapping exception="com.omb.service.exception.UserSessionInvalidException" result="sessionInvalidError"/>
</global-exception-mappings>
我通过实现拦截器找到了一个解决方法:
package com.omb.controller.interceptor;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
public class CustomExceptionInterceptor extends AbstractInterceptor {
Log logger = LogFactory.getLog(CustomExceptionInterceptor.class);
/**
* @see com.opensymphony.xwork2.interceptor.AbstractInterceptor#intercept(com.opensymphony.xwork2.ActionInvocation)
*/
@Override
public String intercept(ActionInvocation invocation) {
try {
return invocation.invoke();
} catch (Exception ex) {
logger.error(ex.getMessage(), ex);
return "error";
}
}
}
struts.xml中的拦截器定义:
<interceptors>
<interceptor name="authz" class="com.omb.controller.security.AuthzInterceptor"/>
<interceptor name="params-filter" class="com.opensymphony.xwork2.interceptor.ParameterFilterInterceptor"/>
<interceptor name="user" class="com.omb.controller.interceptor.UserInterceptor"/>
<interceptor name="customException" class="com.omb.controller.interceptor.CustomExceptionInterceptor"/>
<interceptor-stack name="defaultStack">
<interceptor-ref name="exception">
<param name="exception.logEnabled">true</param>
<param name="exception.logLevel">ERROR</param>
</interceptor-ref>
<interceptor-ref name="alias"/>
<interceptor-ref name="servletConfig"/>
<interceptor-ref name="i18n"/>
<interceptor-ref name="chain"/>
<interceptor-ref name="modelDriven"/>
<interceptor-ref name="fileUpload"/>
<interceptor-ref name="staticParams"/>
<interceptor-ref name="conversionError"/>
<interceptor-ref name="params"/>
<interceptor-ref name="authz"/>
<interceptor-ref name="user"/>
<interceptor-ref name="prepare"/>
<interceptor-ref name="validation"/>
<interceptor-ref name="workflow"/>
<interceptor-ref name="customException"/>
</interceptor-stack>
</interceptors>
真的
错误
package com.omb.controller.interceptor;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
public class CustomExceptionInterceptor extends AbstractInterceptor {
Log logger = LogFactory.getLog(CustomExceptionInterceptor.class);
/**
* @see com.opensymphony.xwork2.interceptor.AbstractInterceptor#intercept(com.opensymphony.xwork2.ActionInvocation)
*/
@Override
public String intercept(ActionInvocation invocation) {
try {
return invocation.invoke();
} catch (Exception ex) {
logger.error(ex.getMessage(), ex);
return "error";
}
}
}
<interceptors>
<interceptor name="authz" class="com.omb.controller.security.AuthzInterceptor"/>
<interceptor name="params-filter" class="com.opensymphony.xwork2.interceptor.ParameterFilterInterceptor"/>
<interceptor name="user" class="com.omb.controller.interceptor.UserInterceptor"/>
<interceptor name="customException" class="com.omb.controller.interceptor.CustomExceptionInterceptor"/>
<interceptor-stack name="defaultStack">
<interceptor-ref name="exception">
<param name="exception.logEnabled">true</param>
<param name="exception.logLevel">ERROR</param>
</interceptor-ref>
<interceptor-ref name="alias"/>
<interceptor-ref name="servletConfig"/>
<interceptor-ref name="i18n"/>
<interceptor-ref name="chain"/>
<interceptor-ref name="modelDriven"/>
<interceptor-ref name="fileUpload"/>
<interceptor-ref name="staticParams"/>
<interceptor-ref name="conversionError"/>
<interceptor-ref name="params"/>
<interceptor-ref name="authz"/>
<interceptor-ref name="user"/>
<interceptor-ref name="prepare"/>
<interceptor-ref name="validation"/>
<interceptor-ref name="workflow"/>
<interceptor-ref name="customException"/>
</interceptor-stack>
</interceptors>