【发布时间】:2019-06-09 22:06:52
【问题描述】:
我在我的 Spring Boot 应用程序中设置了一个过滤器,用于向 MDC 添加一些信息:
@Component
public class LogFilter implements Filter {
@Override
public void init(FilterConfig var1) throws ServletException {}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
try {
MDC.put("tag", "Some information);
chain.doFilter(request, response);
} finally {
MDC.clear();
}
}
@Override
public void destroy() { }
}
这适用于我的大多数应用程序,但对于产生线程的某些操作,此过滤器不会拾取这些消息。
例如,在下面的块中,回调方法发生在一个单独的线程中,所以第一个 log.info 调用被我的 LogFilter 接听,但我的回调中的 log.info 和 log.error 是不。
private void publishMessage(String message) {
log.info("Message received. Sending to Kafka topic");
CompletableFuture<ListenableFuture<SendResult<String, String>>> future = CompletableFuture.supplyAsync(() -> kafkaTemplate.send("myTopic", message));
try {
future.get().addCallback(new ListenableFutureCallback<SendResult<String, String>>() {
@Override
public void onSuccess(SendResult<String, String> result) {
log.info("Kafka topic " + myTopic + " published to successfully");
}
@Override
public void onFailure(Throwable ex) {
log.error("Kafka error: " + ex.getMessage());
}
});
} catch (Exception e) {
log.error("Kafka has failed you for the last time");
}
}
一般来说,似乎任何未在http-nio-8080-exec-X 线程之一中发生的日志事件都会绕过LogFilter。我做错了什么?
我尝试过但没有奏效的方法:
- 让
LogFilter扩展GenericFilterBean,使用@Bean而不是@Component,然后在我的主应用程序类中使用FilterRegistrationBean注册该bean - 使用
@WebFilter(urlPatterns = {"/*"}, description = "MDC Filter")和/或@ServletComponentScan
【问题讨论】:
标签: java spring spring-boot log4j logback