如何过滤Quarkus HTTP访问日志中的Elasticsearch滚动请求等冗余日志?
解决Quarkus Access Log被Elasticsearch Scroll请求淹没的问题
核心问题说明
你之前配置的quarkus.http.access-log.exclude-pattern=(_index+)无效,是因为这个配置只能匹配请求路径/参数,无法识别响应体中的_index字段。下面提供几个便捷的解决方法:
方法1:通过请求路径直接排除ES Scroll请求(最简单)
ES的Scroll请求路径通常是固定的(比如/_search/scroll),直接用路径匹配排除这类请求,无需处理响应内容,性能最优:
在application.properties中添加:
quarkus.http.access-log.exclude-pattern=/_search/scroll(/.*)?
这个正则会匹配所有以/_search/scroll开头的请求路径,直接过滤掉所有ES Scroll相关的access日志。
方法2:自定义AccessLogFilter(灵活匹配响应内容)
如果Scroll请求路径不固定,需要基于响应体中的_index字段过滤,可以自定义过滤器实现:
- 编写过滤器类:
import io.quarkus.vertx.http.runtime.filters.AccessLogFilter; import io.vertx.ext.web.RoutingContext; import jakarta.enterprise.context.ApplicationScoped; @ApplicationScoped public class ExcludeESResponseFilter implements AccessLogFilter { @Override public boolean shouldLog(RoutingContext ctx) { // 先判断是否是ES相关请求(可选,提升性能) String requestPath = ctx.request().path(); if (requestPath.contains("/_search")) { // 获取响应体,判断是否包含_index字段 String responseBody = ctx.response().getBodyAsString(); return responseBody == null || !responseBody.contains("\"_index\""); } // 非ES请求正常记录日志 return true; } }
- 在配置中指定过滤器:
quarkus.http.access-log.filter=com.your.package.ExcludeESResponseFilter
注意:如果响应体过大,
getBodyAsString()可能有性能损耗,建议结合请求路径预判缩小范围。
方法3:调整ES客户端日志级别(快速屏蔽所有ES日志)
如果你不需要ES客户端的任何日志,可以直接调低其日志级别:
quarkus.log.category."org.elasticsearch.client".level=WARN
这个方法会关闭ES客户端的DEBUG/INFO级日志,包括access log中对应的请求记录,但会影响所有ES相关日志的输出,按需选择。
内容的提问来源于stack exchange,提问作者Jan5676
相关产品推荐
相关产品推荐

