【问题标题】:How do I log all queries in embedded ElasticSearch?如何在嵌入式 ElasticSearch 中记录所有查询?
【发布时间】:2017-03-25 22:56:42
【问题描述】:

我正在尝试调试 ElasticSearch 查询。我已经为有问题的查询启用了解释,这表明查询正在做一个中间分数的乘积,它应该做一个总和。 (我正在使用 elastic4s 创建查询请求。)

问题是我看不到生成的查询实际上是什么。我想确定 bug 是在 elastic4s 中(错误地生成查询请求)、在我的代码中还是在 elasticsearch 中。因此,我使用以下代码为测试中使用的嵌入式弹性搜索实例启用了日志记录:

ESLoggerFactory.setDefaultFactory(new Slf4jESLoggerFactory())
val settings = Settings.settingsBuilder
  .put("path.data", dataDirPath)
  .put("path.home", "/var/elastic/")
  .put("cluster.name", clusterName)
  .put("http.enabled", httpEnabled)
  .put("index.number_of_shards", 1)
  .put("index.number_of_replicas", 0)
  .put("discovery.zen.ping.multicast.enabled", false)
  .put("index.refresh_interval", "10ms")
  .put("script.engine.groovy.inline.search", true)
  .put("script.engine.groovy.inline.update", true)
  .put("script.engine.groovy.inline.mapping", true)
  .put("index.search.slowlog.threshold.query.debug", "0s")
  .put("index.search.slowlog.threshold.fetch.debug", "0s")
  .build

但我在 logback.xml 中配置的日志文件中找不到任何查询。来自 elasticsearch 的其他日志消息出现在那里,而不是实际的查询。

【问题讨论】:

  • 用Fiddler嗅探能得到查询吗?

标签: elasticsearch elastic4s


【解决方案1】:

你不能,至少不能直接,至少不能在当前可用的 ES 版本中。这是一些已经讨论过的东西(例如https://github.com/elastic/elasticsearch/issues/9172https://github.com/elastic/elasticsearch/issues/12187),随着任务API 的重写,这似乎很快就会改变。同时,您可以使用 ES Restlog (https://github.com/etsy/es-restlog) 和/或将 nginx 放在 ES 前面并在 nginx 日志中捕获查询。您还可以使用 tcpdump(例如tcpdump -vvv -x -X -i any port 9200)并在服务器上运行时捕获查询。最后一个选项是修改您的应用程序并回显查询而不是执行它(和/或在执行之前将查询插入 ES 本身,因为查询本身是 JSON)。

【讨论】:

    【解决方案2】:

    在 elastic4s 的特定情况下,它提供了在 elastic4s 查询对象上调用 .show 以生成请求的 JSON 正文部分的能力如果 JSON-over-对于大多数类型的请求,已使用 HTTP 协议发送请求。然后可以在代码中方便的位置记录,例如如果您有一种方法可以生成所有 ES 搜索查询。当然,Elasticsearch 中生成假 JSON 的代码仍然可能存在错误,因此不应完全信任它。但是,值得尝试使用 Sense 针对通过 HTTP 的真实 Elasticsearch 集群的输出来重现 .show 的问题 - 如果可以,您 (a) 知道它不是 elastic4s 错误,并且 (b) 可以轻松地操纵JSON 试图找出导致问题的原因。

    show 在某些情况下会调用toString,因此使用普通的 Elasticsearch API 或其他基于 JVM 的包装器,您可以调用它来获取要记录的 JSON 字符串。

    使用嵌入式 Elasticsearch,这在日志记录方面与您将获得的一样好 - 没有在构建器调用上设置断点并观察创建的实际 Java Elasticsearch 请求对象(这是最准确的方法)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-13
      • 1970-01-01
      • 2019-11-04
      • 2010-09-23
      • 2021-04-04
      • 2021-12-24
      • 1970-01-01
      相关资源
      最近更新 更多