慢日志设置
慢日志记录执行时间超过指定阈值的数据库搜索和索引事件。你可以使用这些日志来调查、分析或排查集群的历史搜索和索引性能问题。
慢日志在分片级别报告搜索任务的持续时间,在索引级别报告索引任务的持续时间,但可能不包含客户端观察到的完整任务执行时间。例如,慢日志不会反映 HTTP 网络延迟或任务队列的影响。
达到指定阈值的事件将以 fileset.name
为 slowlog
发送到Elasticsearch 日志记录中。这些日志可以在以下位置查看:
- 如果启用了Elasticsearch 监控,可以在Stack Monitoring 中查看。慢日志事件的
logger
值是index.search.slowlog
或index.indexing.slowlog
。 - 从本地 Elasticsearch 服务日志目录查看。慢日志文件的后缀是
_index_search_slowlog.json
或_index_indexing_slowlog.json
。
以下是慢日志中的一个搜索事件示例:
如果调用是使用 X-Opaque-ID
请求头启动的,则该 ID 会自动包含在搜索慢日志的 elasticsearch.slowlog.id 字段中。有关详细信息和最佳实践,请参阅 X-Opaque-Id HTTP header。
{
"@timestamp": "2024-12-21T12:42:37.255Z",
"auth.type": "REALM",
"ecs.version": "1.2.0",
"elasticsearch.cluster.name": "distribution_run",
"elasticsearch.cluster.uuid": "Ui23kfF1SHKJwu_hI1iPPQ",
"elasticsearch.node.id": "JK-jn-XpQ3OsDUsq5ZtfGg",
"elasticsearch.node.name": "node-0",
"elasticsearch.slowlog.id": "tomcat-123",
"elasticsearch.slowlog.message": "[index6][0]",
"elasticsearch.slowlog.search_type": "QUERY_THEN_FETCH",
"elasticsearch.slowlog.source": "{\"query\":{\"match_all\":{\"boost\":1.0}}}",
"elasticsearch.slowlog.stats": "[]",
"elasticsearch.slowlog.took": "747.3micros",
"elasticsearch.slowlog.took_millis": 0,
"elasticsearch.slowlog.total_hits": "1 hits",
"elasticsearch.slowlog.total_shards": 1,
"event.dataset": "elasticsearch.index_search_slowlog",
"fileset.name" : "slowlog",
"log.level": "WARN",
"log.logger": "index.search.slowlog.query",
"process.thread.name": "elasticsearch[runTask-0][search][T#5]",
"service.name": "ES_ECS",
"user.name": "elastic",
"user.realm": "reserved"
}
以下是慢日志中的一个索引事件示例:
{
"@timestamp" : "2024-12-11T22:34:22.613Z",
"auth.type": "REALM",
"ecs.version": "1.2.0",
"elasticsearch.cluster.name" : "41bd111609d849fc9bf9d25b5df9ce96",
"elasticsearch.cluster.uuid" : "BZTn4I9URXSK26imlia0QA",
"elasticsearch.index.id" : "3VfGR7wRRRKmMCEn7Ii58g",
"elasticsearch.index.name": "my-index-000001",
"elasticsearch.node.id" : "GGiBgg21S3eqPDHzQiCMvQ",
"elasticsearch.node.name" : "instance-0000000001",
"elasticsearch.slowlog.id" : "RCHbt5MBT0oSsCOu54AJ",
"elasticsearch.slowlog.source": "{\"key\":\"value\"}"
"elasticsearch.slowlog.took" : "0.01ms",
"event.dataset": "elasticsearch.index_indexing_slowlog",
"fileset.name" : "slowlog",
"log.level" : "TRACE",
"log.logger" : "index.indexing.slowlog.index",
"service.name" : "ES_ECS",
"user.name": "elastic",
"user.realm": "reserved"
}
你可以在两个级别启用慢日志记录:
- 在Elasticsearch
log4j2.properties
配置文件中为所有索引启用。此方法需要重新启动节点。 - 在索引级别,使用更新索引设置 API
默认情况下,所有阈值都设置为 -1
,这意味着不记录任何事件。
可以为四个日志级别启用慢日志阈值:trace
、debug
、info
和 warn
。你可以通过禁用更详细的级别来模拟设置日志级别阈值。
要查看当前的慢日志设置,请使用获取索引设置 API
GET _all/_settings?expand_wildcards=all&filter_path=*.settings.index.*.slowlog
搜索慢日志按分片发出。必须分别为分片的查询和获取搜索阶段启用它们。
你可以使用 index.search.slowlog.include.user
设置将 user.*
和 auth.type
字段附加到慢日志条目。这些字段包含触发请求的用户信息。
以下代码片段使用log4j2.properties
配置文件调整所有索引的所有可用搜索慢日志设置:
index.search.slowlog.threshold.query.warn: 10s
index.search.slowlog.threshold.query.info: 5s
index.search.slowlog.threshold.query.debug: 2s
index.search.slowlog.threshold.query.trace: 500ms
index.search.slowlog.threshold.fetch.warn: 1s
index.search.slowlog.threshold.fetch.info: 800ms
index.search.slowlog.threshold.fetch.debug: 500ms
index.search.slowlog.threshold.fetch.trace: 200ms
index.search.slowlog.include.user: true
以下代码片段使用更新索引设置 API 调整单个索引的相同设置:
PUT /my-index-000001/_settings
{
"index.search.slowlog.threshold.query.warn": "10s",
"index.search.slowlog.threshold.query.info": "5s",
"index.search.slowlog.threshold.query.debug": "2s",
"index.search.slowlog.threshold.query.trace": "500ms",
"index.search.slowlog.threshold.fetch.warn": "1s",
"index.search.slowlog.threshold.fetch.info": "800ms",
"index.search.slowlog.threshold.fetch.debug": "500ms",
"index.search.slowlog.threshold.fetch.trace": "200ms",
"index.search.slowlog.include.user": true
}
索引慢日志按索引文档发出。
你可以使用 index.indexing.slowlog.include.user
设置将 user.*
和 auth.type
字段附加到慢日志条目。这些字段包含触发请求的用户信息。
以下代码片段使用log4j2.properties
配置文件调整所有索引的所有可用索引慢日志设置:
index.indexing.slowlog.threshold.index.warn: 10s
index.indexing.slowlog.threshold.index.info: 5s
index.indexing.slowlog.threshold.index.debug: 2s
index.indexing.slowlog.threshold.index.trace: 500ms
index.indexing.slowlog.source: 1000
index.indexing.slowlog.reformat: true
index.indexing.slowlog.include.user: true
以下代码片段使用更新索引设置 API 调整单个索引的相同设置:
PUT /my-index-000001/_settings
{
"index.indexing.slowlog.threshold.index.warn": "10s",
"index.indexing.slowlog.threshold.index.info": "5s",
"index.indexing.slowlog.threshold.index.debug": "2s",
"index.indexing.slowlog.threshold.index.trace": "500ms",
"index.indexing.slowlog.source": "1000",
"index.indexing.slowlog.reformat": true,
"index.indexing.slowlog.include.user": true
}
默认情况下,Elasticsearch 在慢日志中记录 _source
字段的前 1000 个字符。你可以使用 index.indexing.slowlog.source
设置调整 _source
的记录方式。将 index.indexing.slowlog.source
设置为 false
或 0
可以完全跳过记录 source。将 index.indexing.slowlog.source
设置为 true
可以记录整个 source,无论其大小如何。
默认情况下,原始的 _source
会被重新格式化,以确保它适合单行日志。如果保留原始文档格式很重要,则可以通过将 index.indexing.slowlog.reformat
设置为 false
来关闭重新格式化。这将导致 source 以原始格式记录,可能会跨越多行日志。
记录慢请求可能会消耗 Elasticsearch 集群的资源,具体取决于符合条件的流量大小。例如,发出的日志可能会增加Elasticsearch 监控集群的索引磁盘使用率。为了减少慢日志的影响,请考虑以下事项:
- 对特定索引启用慢日志记录,而不是对所有索引。
- 设置高阈值以减少记录的事件数量。
- 仅在排查问题时启用慢日志记录。
如果你不确定如何开始调查流量问题,可以考虑在索引级别使用更新索引设置 API 启用 warn
阈值,并设置较高的 30s
阈值。
为搜索请求启用
PUT /*/_settings
{ "index.search.slowlog.include.user": true, "index.search.slowlog.threshold.fetch.warn": "30s", "index.search.slowlog.threshold.query.warn": "30s" }
为索引请求启用
PUT /*/_settings
{ "index.indexing.slowlog.include.user": true, "index.indexing.slowlog.threshold.index.warn": "30s" }
达到慢日志阈值并不能保证集群存在性能问题。如果发现了症状,慢日志可以提供有用的数据来诊断上游流量模式或源头,以解决客户端问题。例如,你可以使用 X-Opaque-ID
、_source
请求体或 user.*
字段中包含的数据来识别问题的来源。这类似于排查实时昂贵任务。
如果你遇到搜索性能问题,还可以考虑使用profile API 调查因查询持续时间而被标记的搜索。然后,你可以使用 profiled query 并通过query profiler 来调查优化选项。这类调查通常应在非生产环境中进行。
慢日志记录在事件完成后检查每个事件是否达到报告阈值。这意味着如果事件触发了断路器错误,它无法报告。如果怀疑存在断路器错误,你还应该考虑启用审计日志记录,它会在事件执行之前记录事件。