【问题标题】:How to enable query logging in Spring-data-elasticsearch如何在 Spring-data-elasticsearch 中启用查询日志记录
【发布时间】:2015-06-07 09:16:30
【问题描述】:

我使用spring-data-elasticsearch框架从elasticsearch服务器获取查询结果,java代码如下:

SearchQuery searchQuery = new NativeSearchQueryBuilder()
.withQuery(matchAllQuery()).withSearchType(SearchType.COUNT)
.addAggregation(new MinBuilder("min_createDate").field("createDate"))
.build();

List<Entity> list = template.queryForList(searchQuery, Entity.class);

虽然我如何知道发送到 elasticssearch 服务器的原始 http 查询? 如何启用日志记录,我尝试添加 log4j,但 spring-data-elasticsearch 似乎没有记录查询。

【问题讨论】:

标签: java elasticsearch spring-data-elasticsearch


【解决方案1】:

在挖掘了 spring 数据代码后,我发现了这个有用的小记录器,名为“tracer”(名称不是很独特)

通过在 application.properties 中设置以下内容

logging.level.tracer=TRACE

它将打印出请求的完整 curl 语句以及来自 Elasticsearch 的完整 JSON 响应。

【讨论】:

  • 它对我不起作用。 KIndly,你能分享你的 application.properties 吗(仅启用 spring-data-elasticsearch 日志的部分)?
  • 唯一对我有用的解决方案,谢谢!
  • 添加到logback-test.xml &lt;logger name="tracer" level="TRACE" /&gt; 时有效。使用springboot 2.2.10 + spring-data-elasticsearch 3.2.10.RELEASE
  • 确实,也是唯一对我有用的解决方案(spring-data-elasticsearch 4.2.4,elasticsearch java client 7.12.1)
  • 唯一对我有用的解决方案,将它用于junit测试,因此添加到测试包application.yml中。
【解决方案2】:

这个已经很老了,但我仍然想分享对我有用的解决方案。要记录通过存储库执行的 Spring Data Elasticsearch 查询,您需要为包 org.springframework.data.elasticsearch.core.* 启用 DEBUG 日志记录,例如如下:

logging:
  level:
    org:
      springframework:
        data:
          elasticsearch:
            core: DEBUG

之后,查询将出现在日志中:

{
  "from" : 0,
  "size" : 1,
  "query" : {
    "bool" : {
      "should" : [ {
        "query_string" : {
          "query" : "John Doe",
          "fields" : [ "entityName" ],
          "default_operator" : "and"
        }
      }, {
        "query_string" : {
          "query" : "John Doe",
          "fields" : [ "alias" ],
          "default_operator" : "and"
        }
      } ]
    }
  },
  "post_filter" : {
    "bool" : { }
  }
}

人们会期待一个类似于 JPA 的优雅解决方案,但它似乎并不简单。

使用 Spring Boot 1.4.0 和 Spring Data Elasticsearch 1.7.3 测试。

【讨论】:

  • 您使用的是哪个版本的spring data elasticsearch?在 2.0.5 中它不适用于我。
  • @TanMaiVan 感谢您的告知。我将它与与 SB 1.4.0M1 一起使用的 SD ES 1.7.3 一起使用。 >2.x.x.中必须有包更改或日志记录跟踪更改。
  • @VladimirSalin。你知道我在 Srpingboot 启动期间为了打印从 Spring-data 发送到 Elasticsearch 的命令做什么吗?我应用了你的建议,我得到了 DEBUG 23872 --- [nio-8080-exec-1] o.s.data.elasticsearch.core.QUERY : {"from":0,"size":2,"query":{"match_all ":{"boost":1.0}},"version":true} 搜索时。到目前为止,一切都很好。尽管如此,我在 Springboot 启动期间创建了索引,我想查看这些命令,但是您的解决方案在 Springboot 初始化期间似乎没有生效
  • @JimC 您需要稍微调查一下引导过程中涉及哪些包,因为它们可能与上面提到的org.springframework.data.elasticsearch.core 不同。找到后,以与 DEBUG 级别类似的方式列出包。
  • @VladimirSalin,如何为 logback.xml 文件执行此操作?我在debug 级别尝试了org.springframework.data.elasticsearch.core.* ,但不适用于.XML 文件配置。
【解决方案3】:

如果您使用的是 spring boot,您可以在 application.properties 中设置以下内容:

logging.level.org.elasticsearch.index.search.slowlog.query=INFO
spring.data.elasticsearch.properties.index.search.slowlog.threshold.query.info=1ms

【讨论】:

  • 1:日志是否写入应用程序日志文件? 2:不使用spring boot而是使用spring ElasticsearchTemplate时如何设置?
  • spring.data.elasticsearch.properties.index.search.slowlog.threshold.query.info 在启动 2.3 中已弃用
【解决方案4】:

我没有 Spring Data Elasticsearch 的答案,但是在 ES 本身中,您可以提高慢速查询日志记录的默认设置并查看慢速日志中的所有查询。更多关于慢日志here的细节。

至于如何更改阈值,应该使用这样的命令:

PUT /_settings
{
  "index.search.slowlog.threshold.query.info": "1ms"
}

1ms 是您可以设置的最小值。

【讨论】:

  • 更新: 2021年,好像可以设置0ms :)
  • 请注意,它为整个 Elastic 集群设置了阈值,而不仅仅是您的应用程序。如果您像我们一样拥有微服务网格,它将为所有微服务设置日志记录,这并不是您想要实现的。
【解决方案5】:

我也遇到了同样的问题,在 ElasticsearchTemplate 中只有少数方法有日志调试级别,例如:

public <T> Page<T> queryForPage(CriteriaQuery criteriaQuery, Class<T> clazz) {
    QueryBuilder elasticsearchQuery = new CriteriaQueryProcessor().createQueryFromCriteria(criteriaQuery.getCriteria());
    QueryBuilder elasticsearchFilter = new CriteriaFilterProcessor().createFilterFromCriteria(criteriaQuery.getCriteria());
    SearchRequestBuilder searchRequestBuilder = prepareSearch(criteriaQuery, clazz);

    if (elasticsearchQuery != null) {
        searchRequestBuilder.setQuery(elasticsearchQuery);
    } else {
        searchRequestBuilder.setQuery(QueryBuilders.matchAllQuery());
    }

    if (criteriaQuery.getMinScore() > 0) {
        searchRequestBuilder.setMinScore(criteriaQuery.getMinScore());
    }

    if (elasticsearchFilter != null)
        searchRequestBuilder.setPostFilter(elasticsearchFilter);
    if (logger.isDebugEnabled()) {
        logger.debug("doSearch query:\n" + searchRequestBuilder.toString());
    }

    SearchResponse response = getSearchResponse(searchRequestBuilder
            .execute());
    return resultsMapper.mapResults(response, clazz, criteriaQuery.getPageable());
}

【讨论】:

    【解决方案6】:

    这适用于 Spring Boot 2.3.3.RELEASE

    logging.level.org.springframework.data.elasticsearch.client.WIRE=trace

    【讨论】:

      【解决方案7】:

      只需将我的两分钱加到@AndreiStefan:现在您可以设置0ms 而不是1ms。使用这种方法似乎可以捕获一些非常快速的查询。

      简单地做:

      PUT /_settings
      {
        "index.search.slowlog.threshold.query.info": "0ms"
      }
      

      【讨论】:

        猜你喜欢
        • 2021-07-13
        • 2018-08-18
        • 2021-08-20
        • 1970-01-01
        • 2011-09-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-31
        相关资源
        最近更新 更多