web-dev-qa-db-ja.com

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がクエリをログに記録しないようです。

15
fudy

Spring Data Elasticsearchに対する回答はありませんが、ES自体で、低速クエリログのデフォルト設定を上げて、低速ログ内のすべてのクエリを確認できます。遅いログの詳細 ここ

しきい値を変更する方法については、次のようなコマンドを使用する必要があります。

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

1msは、設定できる最小値の一種です。

6
Andrei Stefan

Spring Bootを使用している場合は、application.propertiesで以下を設定できます。

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

これはかなり古いですが、それでも私のために働いた解決策を共有したいと思います。リポジトリを介して実行されたSpringData 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 Boot1.4.0およびSpringData Elasticsearch1.7.3でテスト済み。

7
Vladimir Salin

春のデータコードを掘り下げた後、私は「トレーサー」と呼ばれるこの便利な小さなロガーを見つけました(名前はあまりユニークではありません)

Application.propertiesで以下を設定する

logging.level.tracer=TRACE

Elasticsearchからの応答の完全なJSONとともに、要求の完全なcurlステートメントを出力します。

3
abenab

同じ問題が発生しました。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());
}
3
Hongliang Chen