19.6.5 查询、检索与可视化分析

查询、检索与可视化分析是日志平台价值的集中体现,应围绕“快速定位、可复用查询、直观呈现、可协作分析”构建能力。本节以 ELK(Elasticsearch + Kibana)为例给出可落地的安装、查询、排错与练习步骤,适用于日志平台化场景。

文章图片

一、快速安装与最小可用链路(示例)
1)安装 Elasticsearch 与 Kibana(Ubuntu/Debian 示例)

# 安装依赖
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl gnupg

# 导入仓库与安装
curl -fsSL https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elastic.gpg
echo "deb [signed-by=/usr/share/keyrings/elastic.gpg] https://artifacts.elastic.co/packages/8.x/apt stable main" | \
  sudo tee /etc/apt/sources.list.d/elastic-8.x.list

sudo apt-get update
sudo apt-get install -y elasticsearch kibana

# 启动服务
sudo systemctl enable --now elasticsearch
sudo systemctl enable --now kibana

2)最小配置(/etc/elasticsearch/elasticsearch.yml)

cluster.name: ops-logs
node.name: node-1
network.host: 0.0.0.0
http.port: 9200
xpack.security.enabled: false

3)验证服务与索引创建

# 检查 Elasticsearch 健康
curl -s http://127.0.0.1:9200/_cluster/health?pretty

# 创建示例索引模板(按时间字段)
curl -s -X PUT http://127.0.0.1:9200/_index_template/logs_template -H 'Content-Type: application/json' -d '
{
  "index_patterns": ["app-logs-*"],
  "template": {
    "settings": { "number_of_shards": 1 },
    "mappings": {
      "properties": {
        "@timestamp": { "type": "date" },
        "level": { "type": "keyword" },
        "service": { "type": "keyword" },
        "message": { "type": "text" },
        "trace_id": { "type": "keyword" },
        "cost_ms": { "type": "integer" }
      }
    }
  }
}'

二、查询与检索实践(命令 + 解释 + 预期)
1)写入一批示例日志

curl -s -X POST http://127.0.0.1:9200/app-logs-2025.01/_bulk -H 'Content-Type: application/json' -d '
{"index":{}}
{"@timestamp":"2025-01-01T10:00:00Z","level":"ERROR","service":"order","message":"timeout","trace_id":"t1","cost_ms":1200}
{"index":{}}
{"@timestamp":"2025-01-01T10:01:00Z","level":"INFO","service":"order","message":"ok","trace_id":"t2","cost_ms":30}
{"index":{}}
{"@timestamp":"2025-01-01T10:02:00Z","level":"ERROR","service":"pay","message":"db error","trace_id":"t3","cost_ms":800}
'

预期:返回 "errors": false 表示写入成功。

2)关键词 + 范围 + 结构化字段过滤

curl -s -X POST http://127.0.0.1:9200/app-logs-*/_search -H 'Content-Type: application/json' -d '
{
  "query": {
    "bool": {
      "must": [
        { "match": { "message": "error" } }
      ],
      "filter": [
        { "term": { "level": "ERROR" } },
        { "range": { "cost_ms": { "gte": 500 } } }
      ]
    }
  }
}'

解释:must 做全文检索,filter 走倒排/缓存过滤,适合高频字段。

3)聚合统计(错误率/TopN)

curl -s -X POST http://127.0.0.1:9200/app-logs-*/_search -H 'Content-Type: application/json' -d '
{
  "size": 0,
  "aggs": {
    "by_service": {
      "terms": { "field": "service" },
      "aggs": {
        "avg_cost": { "avg": { "field": "cost_ms" } }
      }
    }
  }
}'

预期:得到每个服务的平均耗时,为可视化组件提供数据。

4)按 TraceId 端到端检索

curl -s -X POST http://127.0.0.1:9200/app-logs-*/_search -H 'Content-Type: application/json' -d '
{
  "query": {
    "term": { "trace_id": "t1" }
  },
  "sort": [{ "@timestamp": "asc" }]
}'

三、可视化与仪表盘(Kibana)
1)Kibana 访问与数据视图
- 访问 http://<kibana-host>:5601
- 创建 Data View:app-logs-*,时间字段选择 @timestamp
- 在 Discover 里验证查询是否返回文档

2)一键生成图表并保存
- 在 Lens 中选择 count() 作为 Y 轴,@timestamp 作为 X 轴,形成错误趋势
- 过滤 level: ERROR 并保存为 错误趋势
- 将图表加入仪表盘并设置共享权限

四、性能与排错(命令 + 方法)
1)慢查询排查

# 查看慢查询配置(需开启 slowlog)
curl -s http://127.0.0.1:9200/_cluster/settings?pretty
# 典型 slowlog 配置
curl -s -X PUT http://127.0.0.1:9200/_cluster/settings -H 'Content-Type: application/json' -d '
{
  "persistent": {
    "index.search.slowlog.threshold.query.warn": "2s",
    "index.search.slowlog.threshold.fetch.warn": "1s"
  }
}'

2)索引健康与分片问题

# 检查健康与分片分布
curl -s http://127.0.0.1:9200/_cat/health?v
curl -s http://127.0.0.1:9200/_cat/shards?v

常见问题:
- yellow:副本分片未分配(单节点常见)
- red:主分片异常,查询不可用

3)高频字段索引优化建议

# 查看字段映射,确认 keyword/text 类型
curl -s http://127.0.0.1:9200/app-logs-*/_mapping?pretty

解释:精确过滤字段应为 keyword,全文搜索字段用 text

五、练习与操作清单
1)练习:创建一个“登录失败趋势”视图
- 写入 service=authmessage=login failed 日志
- 在 Kibana 过滤 message:"login failed"
- 以 5 分钟为间隔绘制折线图并保存

2)练习:创建“Top5 错误服务”榜单
- 使用 terms 聚合按 service
- 限制 size=5
- 加入仪表盘,设置只读权限

3)练习:故障定位链路
- 给日志增加 trace_id
- 以 trace_id 过滤并按时间排序
- 将结果导出为 CSV 并共享给开发排查

六、最佳实践要点
- 统一查询语法与模板,避免不同团队语义分歧
- 高频字段建立索引与合理分片,低频字段采用 text 降成本
- 常用图表固化到仪表盘并绑定告警联动
- 对复杂聚合开启异步查询与结果缓存,避免长查询拖垮集群