JasperException 没有出现在 log4j 文件中

JasperException does not appear in log4j file

我有一个使用 Spring 构建的网站,以及一个使用 Log4J 的日志记录引擎。一切都记录得很好,除了 JSP 中的错误,例如:

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

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

非常感谢!

编辑: 我的 log4j 配置文件:

# Root logger option
log4j.rootLogger=DEBUG, infofile, errorfile, stdout

# Log "INFO" messages to a log file
log4j.appender.infofile=org.apache.log4j.RollingFileAppender
log4j.appender.infofile.File=/Library/apache-tomcat-8.0.9/logs/info.log
log4j.appender.infofile.MaxFileSize=1MB
log4j.appender.infofile.MaxBackupIndex=1
log4j.appender.infofile.layout=org.apache.log4j.PatternLayout
log4j.appender.infofile.layout.ConversionPattern=%d{dd-MM-yyyy HH:mm:ss} %-5p %c{1}:%L - %m%n
log4j.appender.infofile.threshold=INFO

# Log "ERROR" messages to a log file
log4j.appender.errorfile=org.apache.log4j.RollingFileAppender
log4j.appender.errorfile.File=/Library/apache-tomcat-8.0.9/logs/error.log
log4j.appender.errorfile.MaxFileSize=1MB
log4j.appender.errorfile.MaxBackupIndex=1
log4j.appender.errorfile.layout=org.apache.log4j.PatternLayout
log4j.appender.errorfile.layout.ConversionPattern=%d{dd-MM-yyyy HH:mm:ss} %-5p %c{1}:%L - %m%n
log4j.appender.errorfile.threshold=ERROR

# Log "INFO" messages to the console
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{dd-MM-yyyy HH:mm:ss} %-5p %c{1}:%L - %m%n
log4j.appender.stdout.threshold=INFO

log4j.logger.org.springframework.integration.expression.ExpressionUtils=ERROR
# Hibernate
#log4j.logger.org.hibernate=INFO, hb
#log4j.logger.org.hibernate.SQL=DEBUG
#log4j.logger.org.hibernate.type=TRACE
#log4j.logger.org.hibernate.hql.ast.AST=info
#log4j.logger.org.hibernate.tool.hbm2ddl=warn
#log4j.logger.org.hibernate.hql=debug
#log4j.logger.org.hibernate.cache=info
#log4j.logger.org.hibernate.jdbc=debug

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

首先要尝试的是配置 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,这肯定会起作用(尽管可能不是 "spring-est" 方式).

类似于:

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 配置中,您可以将上面的 class 放在 @Configuration class 中,如下所示:

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

(在 Spring 中确实有上千种方法...像往常一样)。 如果您使用 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" classes)以查看是否可以一种不那么 verbose/more spring 的方法。链将根据您的配置而有所不同(例如,如果您正在使用它,可能会在其中看到一些 spring-security 过滤器等)。

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

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

log4j.appender.errorfile.Target=System.err