如何在 Spring-data-elasticsearch 中启用查询日志记录
How to enable query logging in Spring-data-elasticsearch
我使用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 不记录查询。
我没有 Spring Data Elasticsearch 的答案,但在 ES 本身中,您可以提高慢速查询日志记录的默认设置,并在慢速日志中查看所有查询。有关慢日志的更多详细信息 here.
关于如何更改阈值,应该使用这样的命令:
PUT /_settings
{
"index.search.slowlog.threshold.query.info": "1ms"
}
1ms
是您可以设置的最小值。
如果您正在使用 spring 引导,您可以在 application.properties 中设置以下内容:
logging.level.org.elasticsearch.index.search.slowlog.query=INFO
spring.data.elasticsearch.properties.index.search.slowlog.threshold.query.info=1ms
我遇到了同样的问题,在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());
}
这个已经很老了,但我仍然想分享对我有用的解决方案。要记录通过存储库执行的 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 数据代码后,我发现了这个有用的小记录器,名为 "tracer"(名称不是很独特)
通过在application.properties
中设置如下
logging.level.tracer=TRACE
它将打印出请求的完整 curl 语句以及来自 Elasticsearch 的完整 JSON 响应。
只是为了向@AndreiStefan 添加我的两分钱:现在您可以设置 0ms
而不是 1ms
。似乎可以使用这种方法捕获一些非常快速的查询。
只需执行:
PUT /_settings
{
"index.search.slowlog.threshold.query.info": "0ms"
}
这适用于 Spring 启动 2.3.3.RELEASE
logging.level.org.springframework.data.elasticsearch.client.WIRE=trace
我使用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 不记录查询。
我没有 Spring Data Elasticsearch 的答案,但在 ES 本身中,您可以提高慢速查询日志记录的默认设置,并在慢速日志中查看所有查询。有关慢日志的更多详细信息 here.
关于如何更改阈值,应该使用这样的命令:
PUT /_settings
{
"index.search.slowlog.threshold.query.info": "1ms"
}
1ms
是您可以设置的最小值。
如果您正在使用 spring 引导,您可以在 application.properties 中设置以下内容:
logging.level.org.elasticsearch.index.search.slowlog.query=INFO
spring.data.elasticsearch.properties.index.search.slowlog.threshold.query.info=1ms
我遇到了同样的问题,在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());
}
这个已经很老了,但我仍然想分享对我有用的解决方案。要记录通过存储库执行的 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 数据代码后,我发现了这个有用的小记录器,名为 "tracer"(名称不是很独特)
通过在application.properties
中设置如下logging.level.tracer=TRACE
它将打印出请求的完整 curl 语句以及来自 Elasticsearch 的完整 JSON 响应。
只是为了向@AndreiStefan 添加我的两分钱:现在您可以设置 0ms
而不是 1ms
。似乎可以使用这种方法捕获一些非常快速的查询。
只需执行:
PUT /_settings
{
"index.search.slowlog.threshold.query.info": "0ms"
}
这适用于 Spring 启动 2.3.3.RELEASE
logging.level.org.springframework.data.elasticsearch.client.WIRE=trace