Kibana使用指南
# Kibana 使用指南
Kibana 是 Elastic Stack 的可视化平台,用于搜索、查看和分析 Elasticsearch 中存储的数据。
# 核心功能模块
| 模块 | 用途 | 典型场景 |
|---|---|---|
| Discover | 浏览和搜索原始文档 | 日常排障、查看单条日志 |
| Lens | 拖拽式可视化图表 | QPS 统计、响应时间分布 |
| Dashboard | 聚合多个可视化面板 | 服务监控大盘 |
| Dev Tools | 直接操作 ES 的控制台 | 调试 DSL、查看 mapping |
| Stack Management | 管理索引模式、保存对象 | 配置 Index Pattern |
| Alerting | 设置告警规则 | 错误率超阈值告警 |
# Discover:日志浏览与搜索
Discover 是日常排障最常用的模块,用于浏览原始文档和执行即席查询。
# 基本操作流程
选择 Index Pattern → 设置时间范围 → 输入 KQL 查询 → 查看结果 → 添加字段列 → 保存查询
# 时间范围选择
右上角时间选择器支持三种模式:
| 模式 | 说明 | 示例 |
|---|---|---|
| 快速选择 | 预设常用时间范围 | 最近 15 分钟 / 1 小时 / 24 小时 / 7 天 |
| 绝对时间 | 精确指定起止时间 | 2026-07-31 14:00:00 ~ 2026-07-31 15:00:00 |
| 相对时间 | 相对于当前时间 | 现在 - 30 分钟 |
排障建议:先缩小时间范围再查询,避免全量扫描导致页面卡顿。
# 字段过滤
左侧字段列表提供快捷过滤:
- 点击字段名 → +:过滤出该字段存在的文档
- 点击字段值 → +:按该值过滤
- 点击字段值 → -:排除该值
顶部 Filter 栏支持更精细的操作:
- 编辑:修改过滤条件
- 临时禁用:点击开关图标,不删除但暂时不生效
- 反转:将
is变为is not - Pin:跨页面切换时保留该过滤条件
# 列定制
- 左侧字段点击 + 添加到表格列
- 表格列可拖拽排序
- 点击列头可排序(仅限数值和日期类型)
- 配置完成后可保存为 Saved Search
# 自动刷新
时间选择器旁可设置 Auto-refresh:
- 10s / 30s / 1m / 5m / 15m
- 适合实时监控场景
# 保存与加载
| 操作 | 说明 |
|---|---|
| Save Query | 保存当前查询条件,下次直接加载 |
| Saved Search | 保存查询 + 列配置,可在 Dashboard 中引用 |
| Open | 加载已保存的查询 |
# KQL 查询语法
KQL(Kibana Query Language)是 Kibana 查询栏的默认语法,专为日志查询设计,比 Lucene 语法更简洁。
# 精准匹配
# 字段值完全匹配
service.name: "user-service"
# 多值匹配(OR 语义)
service.name: ("user-service", "order-service")
# 数值匹配
response.code: 200
# 布尔值
is_error: true
2
3
4
5
6
7
8
9
10
11
# 模糊匹配
# 通配符匹配(* 匹配任意字符,? 匹配单个字符)
uri: *ehome-picture*
message: error?timeout
# 前缀匹配
uri: "http://vnet-vpaas*"
# 模糊搜索(~ 后跟编辑距离,允许 N 个字符差异)
message: "error~1"
message: "timeout~2"
2
3
4
5
6
7
8
9
10
# 逻辑组合
# AND
service.name: "user-service" and response.code: 200
# OR
service.name: "user-service" or service.name: "order-service"
# NOT
not service.name: "user-service"
# 组合(括号优先级最高)
(service.name: "user-service" or service.name: "order-service") and response.code: 200
2
3
4
5
6
7
8
9
10
11
# 范围查询
# 数值范围(闭区间)
response.time: [100 TO 500]
# 时间范围
@timestamp: ["2026-07-31T00:00:00" TO "2026-07-31T23:59:59"]
# 开放范围
response.time: [100 TO *]
response.time: [* TO 500]
2
3
4
5
6
7
8
9
# 字段存在性
# 字段存在
uri: *
# 字段不存在
not uri: *
2
3
4
5
# 转义特殊字符
以下字符在 KQL 中有特殊含义,需用 \ 转义:
+ - = && || > < ! ( ) { } [ ] ^ " ~ * ? : \ /
示例:
message: "error\(timeout\)"
uri: "https\:\/\/example\.com"
2
# KQL vs Lucene 语法对比
| 特性 | KQL | Lucene |
|---|---|---|
| 字段匹配 | field: value | field: value |
| 多值 OR | field: ("a", "b") | field: (a OR b) |
| 逻辑运算 | and / or / not | AND / OR / NOT |
| 范围查询 | field: [1 TO 10] | field:[1 TO 10] |
| 嵌套查询 | 支持嵌套对象 | 不支持 |
| 默认行为 | 不指定字段时搜索所有字段 | 不指定字段时搜索 _all |
| 可读性 | 更高 | 较低 |
切换方式:Stack Management → Advanced Settings →
query:language可切换 KQL / Lucene。
# 字段类型与查询方式
能否模糊匹配取决于字段在 ES 中的 mapping 类型。
# 类型对照表
| 类型 | 支持的查询方式 | 能否模糊匹配 | 典型场景 |
|---|---|---|---|
text | 分词后匹配(match) | 可以 | 日志内容、URL、描述 |
keyword | 精确匹配(term) | 只能精准 | 状态码、服务名、IP |
text + keyword 子字段 | 两者都支持 | uri 模糊,uri.keyword 精准 | 多用途字段 |
long / integer | 数值范围 | 不支持 | 响应时间、状态码 |
date | 时间范围 | 不支持 | @timestamp |
boolean | true / false | 不支持 | 是否错误 |
ip | IP / CIDR 范围 | 不支持 | 客户端 IP |
# 查看字段类型
# 方法一:Dev Tools Console
# 查看某个字段的 mapping
GET ehome-vnet-vpaas-media-accessreq-*/_mapping/field/uri
# 查看完整 mapping
GET ehome-vnet-vpaas-media-accessreq-*/_mapping
2
3
4
5
返回示例:
{
"ehome-vnet-vpaas-media-accessreq-2026.07.31": {
"mappings": {
"properties": {
"uri": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 方法二:Kibana Discover
- 进入 Kibana → Discover
- 选择对应 Index Pattern
- 左侧字段列表中,字段名旁边的图标表示类型:
| 图标 | 类型 | 说明 |
|---|---|---|
t | text | 支持模糊匹配 |
t | keyword | 仅精准匹配 |
# | number | 数值类型 |
| 日历 | date | 日期类型 |
false | boolean | 布尔类型 |
# 方法三:Stack Management
Stack Management → Index Management → 找到索引 → Mappings 标签页
# 常见问题:字段不能模糊搜索
原因:字段被映射为 keyword 类型,只能精准匹配。
解决方案:
临时方案:在 KQL 中用通配符
uri.keyword: *ehome-picture*1注意:
keyword类型用通配符性能较差,仅适合临时排查。根本方案:修改 Index Template,将字段改为
text+keywordPUT _index_template/ehome-vnet-vpaas-media-accessreq-template { "index_patterns": ["ehome-vnet-vpaas-media-accessreq-*"], "template": { "mappings": { "properties": { "uri": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } } } } } }1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19注意:修改模板只对新创建的索引生效,旧索引需要 reindex。
# Lens:可视化图表
Lens 是 Kibana 的拖拽式可视化工具,无需写代码即可创建图表。
# 常用图表类型
| 图表类型 | 适用场景 | X 轴 | Y 轴 |
|---|---|---|---|
| 折线图 | 时间序列趋势 | @timestamp | Count / Avg |
| 柱状图 | 分类对比 | keyword 字段 | Count / Sum |
| 饼图 | 占比分布 | keyword 字段 | Count |
| 数据表 | 明细列表 | 分组字段 | 多个指标 |
| 指标卡 | 单值展示 | - | Count / Avg |
# 创建 QPS 趋势图
- 进入 Lens:主菜单 → Visualize Library → Create visualization → Lens
- 选择数据源:左侧选择 Index Pattern
- 设置 Y 轴:拖入
Records(Count),代表日志条数 - 设置 X 轴:拖入
@timestamp,设为 Date Histogram,间隔1s - 添加过滤:
service.nameisyour-service - 保存:点击 Save,命名后可在 Dashboard 中引用
# 创建响应时间 P95 趋势图
- Y 轴:
response.time,聚合方式选 Percentile,值为95 - X 轴:
@timestamp,间隔1m - 过滤:
uri: "/api/v1/login"
# Dashboard:监控面板
Dashboard 将多个可视化组件聚合到一个页面,适合构建监控大盘。
# 创建 Dashboard
- 主菜单 → Dashboard → Create
- 点击 Add from library,选择已保存的 Lens 图表
- 拖拽调整面板布局和大小
- 顶部可添加全局过滤器,对所有面板生效
- 保存 Dashboard
# 实用技巧
- 时间范围联动:右上角时间选择器对所有面板生效
- 面板钻取:点击图表中的数据点可查看明细
- 自动刷新:设置 Auto-refresh 实现实时监控
- 分享:可生成分享链接或嵌入 iframe
# Dev Tools:ES 控制台
Dev Tools 提供 Console 直接操作 ES,是排障和调试的利器。
# 查询类命令
// 查看所有索引
GET _cat/indices?v
// 查看索引 mapping
GET ehome-vnet-vpaas-media-accessreq-*/_mapping
// 查看索引 settings
GET ehome-vnet-vpaas-media-accessreq-*/_settings
// 搜索文档
GET ehome-vnet-vpaas-media-accessreq-*/_search
{
"query": {
"match": {
"uri": "ehome-picture"
}
},
"size": 10,
"sort": [
{ "@timestamp": "desc" }
]
}
// 按条件计数
GET ehome-vnet-vpaas-media-accessreq-*/_count
{
"query": {
"term": {
"service.name.keyword": "user-service"
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# 排障类命令
// 集群健康状态
GET _cluster/health
// 节点信息
GET _cat/nodes?v
// 分片状态
GET _cat/shards/ehome-vnet-vpaas-media-accessreq-*?v
// 索引大小和文档数
GET _cat/indices/ehome-vnet-vpaas-media-accessreq-*?v&h=index,docs.count,store.size
// ILM 策略
GET _ilm/policy
// 索引模板
GET _index_template/*accessreq*
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 权限问题
执行命令返回 403 时:
{
"error": {
"type": "security_exception",
"reason": "no permissions for [indices:monitor/settings/get] and User [name=xxx]"
},
"status": 403
}
2
3
4
5
6
7
需要联系 ES 管理员添加对应权限。
# 索引与索引模板
# 按天分索引
日志数据通常按天滚动创建索引:
ehome-vnet-vpaas-media-accessreq-2026.07.31
ehome-vnet-vpaas-media-accessreq-2026.07.30
ehome-vnet-vpaas-media-accessreq-2026.07.29
2
3
通配符查询:
| 写法 | 含义 |
|---|---|
accessreq-2026.07.31 | 只查当天一个索引 |
accessreq-* | 查所有日期的索引 |
accessreq-2026.07.* | 查 2026 年 7 月所有索引 |
# 索引模板的作用
新索引创建时,ES 自动匹配模板,应用预定义的 mapping 和 settings:
日志产生 → Filebeat/Logstash 采集
→ 索引名带日期后缀(accessreq-2026.07.31)
→ ES 匹配 index_patterns: "accessreq-*"
→ 自动套用 Index Template 的 mapping
→ 新索引创建完成,数据写入
2
3
4
5
# 查看现有配置
// 列出所有匹配的索引
GET _cat/indices/ehome-vnet-vpaas-media-accessreq-*?v
// 查看索引模板
GET _index_template/*accessreq*
// 旧版模板(ES 7.x 之前)
GET _template/*accessreq*
2
3
4
5
6
7
8
# 常见排障场景
# 场景一:通过 traceId 追踪完整调用链
traceId: "d8e3e6f295764701a0b0488b2782c926"
一个 traceId 可跨多个索引(accessReq、remoteReq、stdout),在 Discover 中切换 Index Pattern 即可看到不同维度的日志。
# 场景二:查找某个第三方接口的调用记录
# remoteReq.log 中模糊匹配 URL
url: *ehome-picture*
# accessReq.log 中精准匹配 URI(keyword 类型)
uri.keyword: "https://ehome-picture.ctseelink.cn"
2
3
4
5
# 场景三:查找错误日志
# 按错误码过滤
response.code: 500
# 按日志级别过滤
level: "ERROR"
# 按关键词模糊搜索
message: *timeout*
# 组合查询
level: "ERROR" and message: *timeout*
2
3
4
5
6
7
8
9
10
11
# 场景四:统计某接口的响应时间分布
- 进入 Lens → 选择 Index Pattern
- X 轴:
@timestamp(Date Histogram,间隔 1 分钟) - Y 轴:
response.time(Percentile,P95) - 过滤:
uri: "/api/v1/login"
# 场景五:确认某服务的 QPS
- 进入 Lens → 选择 Index Pattern
- Y 轴:
Records(Count) - X 轴:
@timestamp(Date Histogram,间隔 1s) - 过滤:
service.nameisyour-service
QPS 的定义:这里统计的是"日志 QPS",即每秒产生的日志条数。它通常可以近似反映服务的请求 QPS,但两者并不完全相等(例如,一个请求可能产生多条日志,或者某些请求没有日志)。要获得最精确的请求 QPS,最好在应用的网关或入口层进行监控。