JasperException没有出现在log4j文件中

时间:2015-07-28 14:45:34

标签: spring log4j

我有一个使用Spring构建的网站,以及一个使用Log4J的日志引擎。一切都记录正常,除了像这样的JSP中的错误:

<button class="emptybutton" data-toggle="modal" data-target="#modal7">
                        <h2>Hover effect 7</h2>
                        <p>
                        <a href="#"><i class="fa fa-twitter"></i></a>
                        <a href="#"><i class="fa fa-facebook"></i></a>
                        <a href="#"><i class="fa fa-instagram"></i></a>
                        <a href="#"><i class="fa fa-dribbble"></i></a>
                        </p>
</button>

错误出现在Eclipse控制台中,但不出现在log4j默认文件中。有什么想法吗?

非常感谢!

编辑: 我的log4j配置文件:

org.apache.jasper.JasperException: /views/user/registration_form.jsp (line: 80, column: 107)

编辑2 :更准确地说,我们能够在Spring MVC应用程序中处理任何异常,除了视图页面抛出的异常(例如JasperException)。

2 个答案:

答案 0 :(得分:1)

首先要尝试的是配置org.springframework.web.servlet.handler.SimpleMappingExceptionResolver来处理JasperException(或者任何类型的事情?)。 奇怪的是,我无法让它工作(它似乎根本不涉及堆栈)。

某种东西:

<bean
    class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"
    p:defaultErrorView="uncaughtException">
    <property name="exceptionMappings">
        <props>
            <prop key=".AccessDeniedException">error403</prop>
            <prop key=".DataAccessException">error500</prop>
            <prop key=".NoSuchRequestHandlingMethodException">error404</prop>
            <prop key=".TypeMismatchException">error404</prop>
            <prop key=".MissingServletRequestParameterException">error404</prop>
            <prop key=".TimeoutException">errorTimeout</prop>
            <prop key=".JasperException">error500</prop>

        </props>
    </property>
    <property name="warnLogCategory"
        value="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver" />
    <property name="defaultStatusCode" value="500" />
</bean>

如果这还不够,您可以随时指定自己的SimpleMappingExceptionResolver扩展名。

现在,如果它根本不起作用(它不适合我),你可以提供自己的javax.servlet.Filter,这肯定会有效(尽管可能不是“最好的”方式)。

类似的东西:

public class MyExceptionHandlerFilter extends GenericFilterBean {

public void doFilter(javax.servlet.ServletRequest request, javax.servlet.ServletResponse response, javax.servlet.FilterChain chain) throws java.io.IOException ,javax.servlet.ServletException {
    try {
        chain.doFilter(request, response);
    } catch (Exception e) {
        // do something with the exception here...
    }
}

}

在Spring 3/4 Java Config中,您可以将该类放在@Configuration类中,如下所示:

@Configuration
public class MyConfig {
  ...
  @Bean
  public Filter exceptionSink() {
    return new MyExceptionHandlerFilter();
  }
  ...
}

(在春天真的有一千种方法......像往常一样)。 如果你使用web.xml,它看起来像这样:

<filter>
    <filter-name>ExceptionHandlerFilter</filter-name>
    <filter-class>com.test.MyExceptionHandlerFilter</filter-class>
</filter>
...
<filter-mapping>
    <filter-name>ExceptionHandlerFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

如果您可以提供错误的堆栈跟踪,它可能会对您的过滤器链有所了解(将在那里寻找任何“springframework”类)以查看是否可能有更简洁/更多的弹簧方式去做吧。根据您的配置,链将有所不同(例如,如果您正在使用它,可能会看到一些弹簧安全过滤器等。)

答案 1 :(得分:0)

我认为JasperExecption正在写入STDERR,这可能就是他们出现在你的eclipse控制台日志中的原因。你能看到catalina.out日志文件中的消息(/logs/catalina.yyyy-mm-dd.out)吗?

您可以尝试将以下内容添加到errorfile appender配置中以捕获错误日志中的消息。

log4j.appender.errorfile.Target=System.err