Spring + Thymeleaf 引擎错误处理和日志记录

Spring + Thymeleaf Engine Error Handling and Logging

我们公司正在将我们的模板引擎从 Velocity 切换到 Thymeleaf。我们使用 Splunk 进行日志记录,并使用 Velocity 实现 org.apache.velocity.runtime.log.LogChute 来处理自定义日志记录(格式化并记录到我们的 splunk 日志),但我一直找不到任何类似的 class百里香叶。

到目前为止,我已经尝试了几种方法。首先,我尝试扩展实际的 Thymeleaf 引擎并在 process 方法周围添加一个 try/catch 包装器,但不幸的是,该方法是最终方法。我看到了添加过滤器以捕获 thymeleaf 错误的建议,但一定是有什么东西吞下了错误,因为它永远不会到达那个 catch 块。

此时我能想到的唯一选择是简单地将 org.thymeleaf.TemplateEngine 日志拉入我们的 splunk 日志,但这样它就无法正确格式化以供摄取,而且我无法添加任何自定义字段.

有人有什么想法吗?

编辑:

哇,所以我只是重试了过滤器方法并且它起作用了,但是捕获的异常是 org.springframework.web.util.NestedServletException,所以 JRebel 一定没有重新加载我的更改来捕获 Exception 而不是 TemplateEngineException 上次试的时候。

就是说,如果有人有更好的方法,我很想听听。 我是整个问题 posting 的新手;我应该 post 回答吗?

过滤方法最终确实奏效了,但是 TemplateEngineExceptionNestedServletException 包围了。

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

import org.springframework.web.util.NestedServletException;
import org.thymeleaf.exceptions.TemplateEngineException;

/**
 * Filter to catch Thymeleaf template errors
 */
public class ThymeleafErrorFilter implements Filter {

    @Override
    public void init(final FilterConfig filterConfig) {

    }

    @Override
    public void doFilter(final ServletRequest servletRequest, final ServletResponse servletResponse, final FilterChain filterChain) throws IOException, ServletException {
        try {
            filterChain.doFilter(servletRequest, servletResponse);
        } catch (final NestedServletException nse) {
            if(nse.getCause() instanceof TemplateEngineException) {
                //Do stuff here
                ...
            }

            throw nse;
        }
    }

    @Override
    public void destroy() {
    }
}

然后注册过滤器

    /**
     * @return thymeleaf error filter
     */
    @Bean
    public FilterRegistrationBean thymeleafErrorFilter() {
        FilterRegistrationBean thymeleafErrorFilter = new FilterRegistrationBean();
        thymeleafErrorFilter.setName("thymeleafErrorFilter");
        thymeleafErrorFilter.setFilter(new ThymeleafErrorFilter());
        thymeleafErrorFilter.addUrlPatterns("/*");
        return thymeleafErrorFilter;
    }