慢日志记录什么
慢日志按耗时阈值把检索与写入请求记录下来:warn、info、debug、trace 四个级别可以分别设阈值,超过阈值的请求就写进对应日志文件。它是判断「哪些查询慢、慢在检索阶段还是取数阶段」最直接的数据来源,日志输出位置由节点的 log4j2 配置决定。
基本信息
| 索引级设置 | index.search.slowlog.threshold.query.*、index.search.slowlog.threshold.fetch.*、index.indexing.slowlog.threshold.index.* |
|---|---|
| 级别 | warn / info / debug / trace 四档,可分别设置阈值 |
| 默认值 | 阈值默认为 -1 表示关闭,开启时显式写时长,如 5s |
| 日志输出 | 由 config/log4j2.properties 中的 logger 与文件名决定 |
| 记录内容 | 查询主体、query 与 fetch 阶段耗时、索引与分片信息 |
典型使用场景
- 定位慢查询:找出超过阈值的检索请求并查看它的 DSL
- 判断瓶颈在检索阶段还是取数阶段:对比 query 与 fetch 两段耗时
- 排查写入变慢:用 indexing 慢日志看哪类文档写入耗时长
- 优化前后对比:开启慢日志验证改造是否真的生效
- 为容量评估提供依据:统计慢请求的比例与分布
开启与配置
开启与配置
# 打开慢日志:查询阶段 5 秒、取数阶段 1 秒以上就记录
PUT /my-index/_settings
{ "index": {
"search.slowlog.threshold.query.warn": "10s",
"search.slowlog.threshold.query.info": "5s",
"search.slowlog.threshold.fetch.warn": "1s",
"indexing.slowlog.threshold.index.info": "5s"
} }
# 查看当前设置与默认值
GET /my-index/_settings?include_defaults=true&flat_settings=true
# 用索引模板统一开启,新建索引自动生效
PUT /_index_template/slowlog-template
{ "index_patterns": ["logs-*"], "template": { "settings": {
"index.search.slowlog.threshold.query.info": "5s",
"index.indexing.slowlog.threshold.index.info": "5s" } } }
# 日志落盘位置在节点侧:config/log4j2.properties 中 slowlog 对应的 appender阈值与用途
| 设置项 | 记录对象 | 用途 |
|---|---|---|
| threshold.query.* | 检索阶段的耗时 | 判断查询条件与索引设计是否有问题 |
| threshold.fetch.* | 取回文档阶段的耗时 | 判断是否返回了过多字段 |
| threshold.index.* | 单次写入的耗时 | 定位写入慢的文档类型 |
| slowlog.level | 记录到哪个级别的事件 | 级别越细日志越多,也越容易淹没 |
慢日志同时记录 query 与 fetch 两段耗时,只看总耗时会误判瓶颈:query 高说明检索条件或索引设计有问题,fetch 高说明返回字段过多或 _source 过大。
排查慢查询时把慢日志与网关访问日志按时间与索引名关联,才能定位到具体是哪个业务或调用方在反复触发;只知道哪条 DSL 慢,往往改不动真正的问题源头。