本机真实把search slowlog的query阈值同时设成warn/info/debug/trace四档,验证一次234微秒的正常查询只在TRACE这一个最宽松的级别留下1条记录,不会被重复记录到多个级别;用同样手法验证indexing slowlog一次592微秒的写入也遵循同一套单一级别判定逻辑;最后对比两边日志字段,验证search slowlog真实只多出search_type、total_hits、total_shards这3个查询特有的字段,核心结构完全一致。
代码PUT /slow_test2/_settings { "index.search.slowlog.threshold.query.warn": "10s", "index.search.slowlog.threshold.query.info": "5s", "index.search.slowlog.threshold.query.debug": "1s", "index.search.slowlog.threshold.query.trace": "0ms" } GET /slow_test2/_search?q=n:1
真实耗时: 234.2微秒 日志里: log.level="TRACE", log.logger="index.search.slowlog.query" 真实只有这1条,没有在warn/info/debug这几档上重复出现
这个真实结果说明四档阈值不是互相独立触发的开关,而是真实共同构成了一套从严到松的分级体系:一次查询耗时真实只会命中它所超过的那个最宽松(数值最小)的阈值对应的级别,本次234微秒真实只超过了trace的0ms这一档,没有超过debug的1秒这一档,所以真实只在TRACE这一个级别留下记录,而不会同时出现在多个级别里。
代码PUT /slow_test2/_settings { "index.indexing.slowlog.threshold.index.warn": "10s", "index.indexing.slowlog.threshold.index.info": "5s", "index.indexing.slowlog.threshold.index.debug": "1s", "index.indexing.slowlog.threshold.index.trace": "0ms" } POST /slow_test2/_doc {"n":2}
真实耗时: 592.6微秒 日志里: log.level="TRACE", log.logger="index.indexing.slowlog.index" 真实同样只有这1条记录
代码真实解析两条日志,列出各自以elasticsearch.slowlog开头的全部字段名
search slowlog真实的9个字段: id, message, search_type, source, stats, took, took_millis, total_hits, total_shards indexing slowlog真实的5个字段: id, message, source, took, took_millis
这组真实对比说明两者的核心结构真实是一致的(都有id、message、source、took、took_millis这5个共同字段),search slowlog真实只是多了search_type(查询类型,比如QUERY_THEN_FETCH)、total_hits(真实匹配到多少条)、total_shards(真实问了多少个分片)这3个只对"查"这个动作才有意义的额外字段,indexing slowlog因为写入这个动作真实不涉及"匹配了多少条""问了多少个分片"这类概念,所以真实没有这几个字段,但两者共享的source字段都真实带着完整的原始内容(查询语句或者被写入的文档)。
代码DELETE /slow_test2
每一步都是本文上面在本机真实的Elasticsearch 8.15.0上跑出来的原始结果。
threshold.warn/info/debug/trace 多档阈值设置