Logging 当struts 2操作类中发生错误时,Log4j未记录

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

在Struts 2应用程序中,发生错误时没有stacktrace。为了在我的action类中测试这一点,我创建了一个null对象,并尝试对其调用一个方法。Struts 2过滤器向我显示了错误屏幕,因此Excepion映射是正确的,但在日志文件中我什么都没有。获取内容的唯一方法是在catch语句中添加带有log.error(e)的try/catch

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-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>