04-Kibana 可视化入门
Kibana 不是一个“漂亮报表工具”这么简单。它是 Elastic Stack 面向人的操作界面,承担三类职责:第一,帮助工程师探索 Elasticsearch 里的原始文档;第二,把字段、查询、聚合转换成图表和仪表板;第三,作为运维、安全、可观测性、告警、空间、权限等功能的入口。

ELK Stack 系列第 04 篇。前一篇已经把 Logstash 管道讲清楚:日志如何从输入进入、如何被 filter 结构化、如何输出到 Elasticsearch。本文继续把链路走完,重点讲 Kibana 如何把索引里的日志变成可检索、可解释、可复用的可视化视图。Kibana 的菜单和功能名称会随版本微调,本文按当前 Elastic 文档中的 Data View、Discover、Lens、Dashboard、KQL、Saved Objects 等概念组织。
一、Kibana 在 ELK 链路中的位置
Kibana 不是一个“漂亮报表工具”这么简单。它是 Elastic Stack 面向人的操作界面,承担三类职责:第一,帮助工程师探索 Elasticsearch 里的原始文档;第二,把字段、查询、聚合转换成图表和仪表板;第三,作为运维、安全、可观测性、告警、空间、权限等功能的入口。
在日志平台建设中,Kibana 的价值不是把所有数据都做成图,而是把“数据是否进来了”“字段是否解析正确”“异常是否能被定位”“趋势是否能被团队持续复用”这几件事串起来。一个健康的 ELK 落地顺序通常是:先有稳定采集,再有正确解析,再有可查询字段,最后才有仪表板。如果前面的索引、时间戳、字段类型没有处理好,Kibana 只能把问题暴露出来,不能替你修复数据质量。
这张图强调一个顺序:Kibana 的大多数分析能力都从 Data View 开始,然后在 Discover 中确认字段含义,再进入 Lens 和 Dashboard。不要跳过 Discover 直接做图,否则很容易在错误字段上做出看似合理的结论。
本文的目标是让你完成一个最小但完整的 Kibana 可视化闭环:
- 确认 Elasticsearch 中已有可分析日志索引。
- 创建或选择 Data View。
- 在 Discover 中验证时间字段、关键字段和查询条件。
- 用 Lens 制作几个基础图表。
- 组合成一个可用于日常巡检的 Dashboard。
- 掌握常见“没有数据、图表不准、字段不可聚合、时间范围不对”的排查路径。
二、准备工作:先确认数据真的可用
Kibana 的第一类问题经常不是 Kibana 问题,而是数据链路问题。进入界面前,先在 Elasticsearch 侧确认索引和文档存在。
2.1 确认索引和数据流
如果前一篇 Logstash 输出使用的是 app-logs-%{+YYYY.MM.dd} 这类索引命名,可以先检查索引列表:
curl -k -u elastic:YOUR_PASSWORD \
"https://localhost:9200/_cat/indices/app-logs-*?v&s=index"
如果使用 Elastic Agent 或 Filebeat 的新式集成,数据可能进入 data stream,例如 logs-nginx.access-default、logs-system.syslog-default。可以用下面的命令查看:
curl -k -u elastic:YOUR_PASSWORD \
"https://localhost:9200/_data_stream/logs-*?pretty"
需要关注四个信息:
| 检查项 | 为什么重要 | 正常现象 |
|---|---|---|
| 索引或 data stream 是否存在 | Kibana 无法凭空分析不存在的数据 | 能看到匹配名称 |
| 文档数量是否增长 | 判断采集是否仍在工作 | docs.count 递增 |
| 时间字段是否存在 | Dashboard 默认依赖时间范围过滤 | 有 @timestamp 或业务时间字段 |
| 字段类型是否正确 | Lens 聚合依赖 keyword、number、date 等类型 | 状态码是数字或 keyword,耗时是数字 |
2.2 抽样查看文档结构
不要只看索引名,还要抽样看文档。下面的查询按最近时间取 3 条日志:
curl -k -u elastic:YOUR_PASSWORD \
-H "Content-Type: application/json" \
"https://localhost:9200/app-logs-*/_search?pretty" \
-d '{
"size": 3,
"sort": [
{ "@timestamp": { "order": "desc" } }
],
"_source": [
"@timestamp",
"service.name",
"log.level",
"message",
"http.response.status_code",
"event.duration"
]
}'
如果结果里只有 message,没有结构化字段,说明 Logstash 的 filter 还没有把日志解析到位。此时先回到 Logstash数据管道配置 检查 grok、json、date、mutate 等处理逻辑,再继续做可视化。Kibana 可以在 message 上全文搜索,但生产仪表板必须依赖稳定字段。
2.3 确认 Kibana 能连接 Elasticsearch
在 systemd 安装场景下,先确认 Kibana 服务运行:
sudo systemctl status kibana
sudo journalctl -u kibana -n 80 --no-pager
常见配置文件路径为 /etc/kibana/kibana.yml。基础连接项示例:
server.host: "0.0.0.0"
server.port: 5601
elasticsearch.hosts: ["https://127.0.0.1:9200"]
elasticsearch.username: "kibana_system"
elasticsearch.password: "YOUR_KIBANA_SYSTEM_PASSWORD"
生产环境不要把 elastic 超级用户长期配置给 Kibana 服务本身。elastic 更适合用于初始化、应急和管理操作,日常服务连接应使用专用系统用户或符合当前 Elastic 安全模型的服务配置。
三、Data View:Kibana 理解数据的入口
Elastic 早期文档和老版本界面中常见 “Index Pattern” 这个名称,当前 Kibana 更推荐使用 “Data View”。Data View 可以指向一个或多个 Elasticsearch 索引、data stream 或索引别名。官方文档也说明,Discover、Lens 等分析功能通常需要 Data View 才能访问 Elasticsearch 数据;某些场景下 ES|QL 可以不依赖 Data View,但日志平台入门阶段仍建议先掌握 Data View。
这张图说明 Data View 不是数据副本,而是 Kibana 访问数据的逻辑视图。改 Data View 不会移动 Elasticsearch 中的文档,但会影响 Kibana 里能看到哪些字段、默认使用哪个时间字段、字段如何格式化。
3.1 创建 Data View
在 Kibana 中进入:
Stack Management -> Kibana -> Data Views -> Create data view
以应用日志为例:
| 配置项 | 示例值 | 说明 |
|---|---|---|
| Name | app-logs |
Kibana 中展示的名称 |
| Index pattern | app-logs-* |
匹配 Elasticsearch 索引 |
| Timestamp field | @timestamp |
用于时间过滤 |
如果 Kibana 提示没有匹配索引,通常有三种原因:索引确实不存在;当前用户没有索引读取权限;输入的 pattern 与实际索引或 data stream 名称不匹配。不要急着刷新页面,先回到 Elasticsearch API 确认 _cat/indices 或 _data_stream 输出。
3.2 Data View 权限
创建和管理 Data View 需要 Kibana 侧的数据视图管理权限,以及 Elasticsearch 侧查看索引元数据的权限。最小权限思路可以拆成两层:
- 平台管理员拥有 Data View 管理、Saved Objects 管理、空间管理等权限。
- 普通运维人员拥有目标索引的 read、view_index_metadata,以及对应空间中 Dashboard/Discover/Lens 的使用权限。
如果界面上出现只读提示,或创建按钮不可见,不一定是 Kibana 异常,很可能是角色权限不足。生产环境应通过角色设计解决,而不是直接给所有人超级用户。
3.3 字段刷新与格式设置
Logstash 修改字段后,Elasticsearch mapping 会变化,Kibana Data View 字段列表未必立即展示最新字段。可以在 Data View 详情页执行刷新字段列表。刷新后检查:
@timestamp是否被识别为 date。http.response.status_code是否可用于 Terms 或 Top values。event.duration、response_time、bytes是否是 number。message是否保留为全文检索字段。.keyword子字段是否存在,能否用于精确聚合。
字段格式也很重要。比如字节数字可以设置为 Bytes 格式,百分比可以设置为 Percentage,持续时间字段可以根据单位设置显示格式。格式设置不会改变原始文档,但会让 Dashboard 更容易读。
当前 Kibana 还支持 runtime fields 和 ES|QL 这类更灵活的分析方式。它们适合临时探索、补充计算字段或验证新口径,但不要把所有生产字段都放到查询时计算。官方文档也提醒,runtime fields 会在查询时计算,可能影响性能。对 Dashboard 高频使用的字段,仍应优先在 Logstash、ingest pipeline 或索引模板阶段治理好。
四、Discover:先把数据看懂,再做图
Discover 是 Kibana 中最适合排查数据质量的入口。很多团队把它当“搜索日志的页面”,但它更重要的作用是验证字段、查询、时间范围和样本数据。
4.1 建立第一次查询
进入 Discover 后,选择刚才创建的 Data View,例如 app-logs。第一件事不是输入复杂查询,而是把时间范围调到你确定有数据的窗口,比如 Last 15 minutes、Last 24 hours,或者某个明确日期。
常用 KQL 示例:
log.level: "ERROR"
service.name: "payment-api" and http.response.status_code >= 500
message: "timeout" or message: "connection refused"
KQL 面向字段过滤,适合日常查询;Lucene Query Syntax 更偏传统查询表达式;ES|QL 适合管道式检索、转换和统计。入门阶段建议先用 KQL,因为它和 Dashboard filter、Lens 过滤条件的心智模型一致。
4.2 调整显示字段
默认表格可能只显示 Time 和 _source。为了让日志排查更高效,可以添加以下字段到表格:
| 字段 | 用途 |
|---|---|
@timestamp |
确认日志时间是否正确 |
service.name |
区分服务 |
host.name |
区分主机 |
log.level |
区分日志级别 |
http.response.status_code |
快速识别 4xx/5xx |
url.path |
分析接口路径 |
event.duration |
分析耗时 |
trace.id |
和链路追踪关联 |
message |
保留原始上下文 |
如果字段列表中没有你期望的字段,优先检查 Logstash 解析和 Elasticsearch mapping。如果字段存在但不可聚合,通常是类型不对,或者只有 text 字段而没有 keyword 子字段。
4.3 保存 Discover 查询
常用查询可以保存,后续加入 Dashboard 或作为排障入口。例如保存一个名为 应用错误日志 - 最近 24 小时 的 Discover 视图,包含:
- Data View:
app-logs - KQL:
log.level: "ERROR" or http.response.status_code >= 500 - 显示字段:时间、服务、主机、状态码、路径、消息
- 排序:按
@timestamp降序
保存查询的价值在于团队复用。同一个问题不必每个人重新输入字段和过滤条件,值班人员打开 Dashboard 时就能直接跳到对应明细。
五、Lens:从字段到图表的最短路径
Lens 是 Kibana 中现代化的拖拽式可视化编辑器。它把“选择字段、选择聚合方式、选择图表类型”变成了更低门槛的交互流程。对于日志平台,Lens 最适合做趋势、分布、Top N、单值指标和简单对比。
这张图是做 Lens 的基本路线。关键不是先选图表,而是先问清楚“这个图要回答什么问题”,再根据字段类型选择合适的聚合方式。
5.1 图表一:日志量趋势
第一个图建议做“每分钟日志量趋势”。它回答的是:日志是否持续进入系统、是否出现流量尖峰、是否有采集中断。
配置思路:
| 项目 | 配置 |
|---|---|
| Visualization type | Line 或 Area |
| X-axis | @timestamp,Date histogram |
| Y-axis | Count of records |
| Breakdown | 可选 service.name 的 Top values |
| Filter | 可选排除健康检查日志 |
如果日志量突然归零,先不要判断业务无请求。可能是 Filebeat 停止、Logstash pipeline 阻塞、Elasticsearch 拒写、索引生命周期切换失败,也可能只是 Dashboard 时间范围选错。这个图的价值在于第一时间暴露链路断点。
5.2 图表二:错误率与错误数量
错误数量和错误率不是一回事。只有错误数量时,高流量时段天然更高;只有错误率时,小流量样本可能被放大。入门 Dashboard 可以先放两个面板:
| 面板 | 指标 | 说明 |
|---|---|---|
| 5xx 数量 | http.response.status_code >= 500 的 Count |
看绝对错误规模 |
| 5xx 占比 | 5xx Count / 总请求 Count | 看服务质量变化 |
在 Lens 中,可以用过滤指标或公式完成类似计算。示例公式思路:
count(kql='http.response.status_code >= 500') / count()
实际字段名要以你的 ECS 映射或 Logstash 输出为准。若字段是字符串类型,例如 "500",KQL 需要写成:
http.response.status_code: "500"
更推荐在 Logstash 或 ingest pipeline 中把状态码转换为数字,便于范围查询和聚合。
5.3 图表三:Top URL 与慢请求
日志可视化不只看错误,也要看热点和慢请求。常见图表:
| 图表 | 推荐字段 | 聚合方式 |
|---|---|---|
| Top URL | url.path 或 request.path.keyword |
Top values + Count |
| 平均响应时间 | event.duration 或 http.response.duration |
Average |
| P95 响应时间 | 持续时间字段 | Percentile 95 |
| 慢请求列表 | Saved Discover | 过滤 event.duration > 阈值 |
如果 url.path 基数非常高,例如带订单号、用户 ID、随机 token,Top values 会被大量唯一 URL 冲散。生产环境应在采集阶段规范化路径,把 /orders/12345 归一为 /orders/{id},或者额外写入 url.route 字段。Dashboard 不是清洗数据的地方,它只能消费已经治理好的字段。
5.4 图表四:按服务、主机、环境拆分
一个图表是否有用,很大程度取决于维度是否稳定。日志平台常用维度包括:
service.nameservice.environmenthost.namekubernetes.namespacecontainer.namelog.levelevent.dataset
例如“各服务错误数 Top 10”可以快速定位哪个服务在制造告警;“各主机日志量 Top 10”可以发现异常刷日志或采集偏斜;“环境维度拆分”可以避免把测试环境噪声误判为生产事故。
在 Lens 中,Breakdown by 不宜无限增加。一个图最多拆 1 到 2 个主要维度,超过后可读性会急剧下降。复杂分析应拆成多个面板,而不是在一个图里堆满颜色。
六、Dashboard:把排查路径固化下来
Dashboard 是多个面板的组合,不是图表仓库。一个好 Dashboard 应该围绕一个稳定场景组织,例如“生产应用日志巡检”“Nginx 访问日志分析”“数据库慢查询观察”“Logstash 管道健康检查”。如果不同角色、不同问题都塞在同一个页面里,最后所有人都会迷路。
这张图给出 Dashboard 的组织方式:先判断有没有异常,再定位异常维度,最后进入明细。页面布局也应遵循这个顺序,让值班人员从上到下完成一次巡检。
6.1 一个入门 Dashboard 的布局
推荐从一个生产应用日志 Dashboard 开始:
| 区域 | 面板 | 目的 |
|---|---|---|
| 顶部指标 | 总日志量、错误数、错误率、P95 响应时间 | 快速判断状态 |
| 趋势区 | 日志量趋势、5xx 趋势、响应时间趋势 | 看异常是否持续 |
| 定位区 | 服务 Top、主机 Top、URL Top、错误类型 Top | 找责任边界 |
| 明细区 | Saved Discover:错误日志、慢请求日志 | 直接下钻排障 |
顶部指标不要太多。运维巡检页面最怕“每个数字都重要”,结果没有一个数字能触发行动。先选择 4 到 6 个对班组有意义的指标,再随着事故复盘迭代。
6.2 时间范围与全局过滤器
Dashboard 的全局时间范围会影响所有使用同一时间字段的面板。常用时间范围:
- 生产巡检:最近 15 分钟、最近 1 小时。
- 日报复盘:昨天 00:00 到 23:59。
- 发布观察:发布前后各 30 分钟。
- 容量分析:最近 7 天、最近 30 天。
全局过滤器适合放这些维度:
service.environment: "prod"
service.name: "payment-api"
host.name: "app-01"
如果某个 filter 被 pin 到全局,它可能影响 Discover、Lens、Dashboard 等多个应用。值班时要注意过滤器是否被固定,否则可能出现“明明有数据但图上没有”的误判。
6.3 Dashboard Controls
Controls 可以把常用字段变成下拉筛选、范围筛选或时间滑块。对运维团队来说,最常见的 controls 是:
| Control | 字段 | 使用场景 |
|---|---|---|
| Environment | service.environment |
prod/staging/dev 切换 |
| Service | service.name |
按服务定位 |
| Host | host.name |
按主机定位 |
| Log level | log.level |
ERROR/WARN/INFO |
| Status code | http.response.status_code |
HTTP 问题排查 |
Controls 的优点是降低使用门槛,缺点是依赖字段基数和字段质量。如果 service.name 命名不统一,例如同一个服务同时出现 pay-api、payment-api、payment_service,筛选器会把团队带向错误结论。字段命名治理仍然要回到采集和规范层。
七、一个完整 walkthrough:从 Nginx 日志到访问分析仪表板
下面以 Nginx 访问日志为例,串起 Kibana 入门流程。假设 Logstash 已经把日志解析为接近 ECS 的字段:
{
"@timestamp": "2026-06-01T06:30:00.000Z",
"service.name": "nginx",
"host.name": "web-01",
"client.ip": "192.0.2.10",
"http.request.method": "GET",
"url.path": "/api/orders/123",
"http.response.status_code": 200,
"event.duration": 153000000,
"user_agent.original": "Mozilla/5.0 ...",
"message": "192.0.2.10 - - ..."
}
这里的 event.duration 如果使用 ECS 语义,单位通常是纳秒。你的 Logstash 管道也可以使用毫秒字段,例如 nginx.response_time_ms。关键是 Dashboard 内部要保持单位一致,并在字段名或面板标题中讲清楚。
7.1 创建 Data View
假设索引为 nginx-access-2026.06.01,Data View 配置如下:
Name: nginx-access
Index pattern: nginx-access-*
Timestamp field: @timestamp
创建后刷新字段列表,并检查:
http.response.status_code可聚合。url.path有 keyword 可用于 Top values,或本身就是 keyword。event.duration是 number。client.ip类型适合过滤和聚合。
7.2 Discover 验证
在 Discover 中先执行:
service.name: "nginx"
再执行:
http.response.status_code >= 500
如果第二个查询报错或没有结果,需要确认状态码字段是不是数字。如果字段是 text,范围比较无法按预期工作。临时可以用字符串精确匹配,但长期应修正 mapping 和 Logstash 类型转换。
7.3 制作四个 Lens 面板
第一个面板:请求量趋势。
| 配置 | 值 |
|---|---|
| 图表 | Area |
| X | @timestamp Date histogram |
| Y | Count |
| Breakdown | http.response.status_code Top values,可选 |
第二个面板:5xx 错误率。
| 配置 | 值 |
|---|---|
| 图表 | Metric 或 Line |
| 指标 | count(kql='http.response.status_code >= 500') / count() |
| 格式 | Percentage |
第三个面板:Top URL。
| 配置 | 值 |
|---|---|
| 图表 | Bar horizontal |
| Y | url.path Top values |
| X | Count |
第四个面板:P95 响应时间。
| 配置 | 值 |
|---|---|
| 图表 | Line |
| X | @timestamp Date histogram |
| Y | Percentile 95 of event.duration |
如果持续时间单位是纳秒,可以在 Lens 公式里换算为毫秒,或者在采集阶段新增毫秒字段。不要让 Dashboard 上的 153000000 裸露给值班人员。
7.4 组合成 Dashboard
Dashboard 命名建议:
生产 Nginx 访问日志巡检
页面顶部放 Controls:
host.namehttp.response.status_codeurl.path
然后按“总览 -> 趋势 -> 分布 -> 明细”布局。最后加入一个 Saved Discover 面板,过滤条件为:
http.response.status_code >= 500 or event.duration > 1000000000
这样值班人员看到错误率上升时,可以直接在同一页面下方看到具体错误日志,而不是再打开 Discover 重新拼查询。
这张时序图说明 Dashboard 不是终点。真正排障时,图表提供方向,Discover 提供证据,Elasticsearch 保存可追溯的原始上下文。
八、字段设计决定可视化上限
很多 Kibana 新手问题最后都会回到字段设计。可视化面板只负责聚合和展示;字段是否稳定、类型是否正确、基数是否可控、时间是否可信,决定了图表是否有意义。
8.1 优先采用 ECS 思路
Elastic Common Schema(ECS)为日志、指标、事件提供了一套通用字段命名规范。你不一定一开始就完全覆盖 ECS,但建议优先采用以下常见字段:
| 语义 | 推荐字段 |
|---|---|
| 服务名 | service.name |
| 环境 | service.environment |
| 主机 | host.name |
| 日志级别 | log.level |
| 客户端 IP | client.ip |
| HTTP 方法 | http.request.method |
| 状态码 | http.response.status_code |
| URL 路径 | url.path |
| 事件耗时 | event.duration |
| Trace ID | trace.id |
采用统一字段的好处是跨服务、跨团队、跨数据源做 Dashboard 时不需要每个系统都重新适配。如果 A 服务叫 level,B 服务叫 severity,C 服务叫 logLevel,Lens 里就无法用一个过滤器完成统一分析。
8.2 text 与 keyword 的区别
Elasticsearch 中 text 适合全文检索,keyword 适合精确匹配、排序和聚合。Kibana 中最常见的困惑是:为什么某个字段能搜索,却不能放到 Terms 或 Top values 里?
通常原因是字段只有 text 类型,没有 .keyword 子字段。例如:
"url.path": {
"type": "text"
}
更适合可视化的 mapping 是:
"url.path": {
"type": "keyword",
"ignore_above": 2048
}
或者同时保留 text 和 keyword:
"message": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 1024
}
}
}
日志平台中,message 更适合 text,service.name、host.name、log.level、url.path 更适合 keyword 或具备 keyword 子字段。
8.3 高基数字段谨慎做 Top N
高基数字段是指唯一值非常多的字段,例如:
- 用户 ID
- 订单 ID
- 请求 ID
- 完整 URL,尤其包含 query string
- Trace ID
- 原始 message
这些字段不是不能分析,而是不适合直接做 Top values。否则 Dashboard 会出现大量一次性值,聚合成本高,可读性低。更好的做法是:
- 保留高基数字段用于精确下钻。
- 增加低基数字段用于聚合,例如
url.route、error.type、service.name。 - 对业务 ID 使用 Discover 查询,不把它们放在首页 Dashboard。
九、常见可视化问题排查
Kibana 排障要有固定路径。下面这棵决策树覆盖了最常见的入门问题。
这张图可以作为值班排障顺序。先确认时间范围和 Discover,再看字段类型,最后才怀疑 Kibana 面板本身。
9.1 Dashboard 没有数据
优先检查:
- 时间范围是否覆盖日志时间。
- Data View 是否匹配索引或 data stream。
- 当前 Kibana Space 是否有对应 Saved Object。
- 用户是否有目标索引 read 权限。
- 面板级过滤器是否过窄。
- 全局 pinned filter 是否来自另一个页面。
验证命令:
curl -k -u elastic:YOUR_PASSWORD \
-H "Content-Type: application/json" \
"https://localhost:9200/app-logs-*/_search?pretty" \
-d '{
"size": 0,
"query": {
"range": {
"@timestamp": {
"gte": "now-24h",
"lte": "now"
}
}
}
}'
如果 API 有数据而 Discover 没数据,重点检查 Data View 和权限;如果 API 也没数据,回到采集链路。
9.2 字段看得到但不能做图
典型原因:
- 字段类型是
text,不能做 terms 聚合。 - 数字被写成字符串,不能做平均值、百分位、范围过滤。
- 日期字段格式不符合 mapping,导致未被识别为 date。
- Data View 字段缓存未刷新。
检查 mapping:
curl -k -u elastic:YOUR_PASSWORD \
"https://localhost:9200/app-logs-*/_mapping/field/http.response.status_code?pretty"
如果 mapping 已经错误,不能简单靠 Kibana 修复。通常需要创建新索引模板,然后让新数据进入正确索引;历史数据如果需要修正,则通过 reindex 或 transform 迁移。
9.3 图表数字比预期大
常见原因:
| 现象 | 可能原因 |
|---|---|
| 日志量翻倍 | Filebeat 和 Logstash 重复采集同一文件 |
| 错误数异常高 | 同一错误堆栈被多行拆成多条事件 |
| Top URL 被 query 参数冲散 | URL 未归一化 |
| 响应时间极大 | 单位混淆,秒、毫秒、纳秒混用 |
| 某服务占比异常 | service.name 默认值或解析失败 |
排查时不要只看图,必须回到 Discover 抽样原始文档。图表是聚合结果,聚合错误往往来自源文档不一致。
9.4 Dashboard 打开很慢
可能原因包括:
- 时间范围过大,比如默认打开最近 90 天。
- 面板太多,每个面板都触发昂贵聚合。
- 对高基数字段做 terms 聚合。
- 索引分片过多或过大。
- 查询命中了过多历史索引。
- Lens 公式过于复杂。
优化策略:
- 默认时间范围控制在最近 15 分钟到 24 小时。
- 首页只放核心面板,深度分析拆到二级 Dashboard。
- 避免在首页对 trace.id、message、完整 URL 做 Top values。
- 使用索引生命周期管理和合理索引模式,让查询只扫必要数据。
- 为常用过滤字段保证正确 mapping。
十、从入门 Dashboard 走向生产实践
入门 Dashboard 完成后,不要停留在“能看图”。生产化需要补上命名、权限、空间、版本管理和告警联动。
10.1 命名与分层
建议建立统一命名:
[环境] [系统/服务] [用途]
生产 支付服务 日志巡检
生产 Nginx 访问分析
生产 Logstash 管道健康
测试 应用错误排查
Dashboard 分层建议:
| 层级 | 目的 | 示例 |
|---|---|---|
| L1 总览 | 值班快速判断 | 全局日志量、错误率、服务 Top |
| L2 服务 | 单服务深入分析 | payment-api 日志、慢请求、错误类型 |
| L3 专项 | 特定问题排查 | 登录失败、网关 502、Logstash DLQ |
| L4 复盘 | 周期性分析 | 发布前后对比、容量趋势、质量报告 |
10.2 Space 与权限
Kibana Space 可以把不同团队、环境或项目的 Saved Objects 隔离开。常见做法:
prod-ops:生产运维巡检。security:安全分析。dev:开发调试。shared:通用模板和示例。
权限不要只按“能不能登录 Kibana”划分,而要按“能看哪些数据、能改哪些对象、能不能导出、能不能管理 Data View”划分。生产 Dashboard 应限制编辑权限,避免值班期间误删面板。
10.3 Saved Objects 的备份与迁移
Dashboard、Lens、Data View、Saved Discover 都属于 Kibana Saved Objects。生产环境要定期导出备份,尤其在升级 Kibana、调整 Space、迁移集群前。
备份思路:
Stack Management -> Saved Objects -> Export
迁移时要注意:
- 目标环境是否存在同名 Data View。
- 索引 pattern 是否一致。
- Space 是否一致。
- 字段 mapping 是否一致。
- 版本差异是否导致可视化对象需要迁移。
对于关键 Dashboard,建议在变更前导出 NDJSON 文件并纳入内部配置库管理。这样 Kibana 升级或误操作后可以快速恢复。
Saved Objects 还要和字段变更联动。一个 Dashboard 可能依赖某个 Data View、某个字段格式、某个 Lens 公式和某个 Saved Discover。如果 Logstash 把 response_time 改成 event.duration,或者 Filebeat 把数据流命名从 nginx-access-* 改成 logs-nginx.access-*,Kibana 对象不会自动理解你的迁移意图。结果可能是面板报错、字段消失、公式返回空值,或者更隐蔽地显示错误口径。
因此,Kibana 变更也需要最小发布流程:
- 先列出被影响的 Data View、Dashboard、Lens 和 Saved Discover。
- 在测试 Space 或临时 Data View 中验证新字段。
- 导出变更前 Saved Objects。
- 更新面板和说明文字。
- 用固定时间窗口对比新旧 Dashboard 结果。
- 通知值班人员口径变化。
这个流程看起来比“进页面拖一下图”麻烦,但它能避免生产事故中打开 Dashboard 才发现关键面板已经失效。Kibana 页面一旦进入值班流程,它就不是个人作品,而是运维工具。
10.4 与告警联动
Dashboard 是观察工具,不是告警系统。生产日志平台需要把可视化和告警分开设计:
- Dashboard 用于观察趋势、定位问题、复盘。
- Alert 用于无人值守发现异常。
- Discover 用于取证。
- Elasticsearch 查询和索引用于保存事实。
例如 5xx 错误率超过阈值时,告警通知值班人员;值班人员打开 Dashboard 看趋势和影响范围;再进入 Discover 抽样错误日志;最后结合应用日志、链路追踪、发布记录定位根因。
这张状态图把 Dashboard 放在事件生命周期里。它最重要的作用是帮助判断异常是否扩大、处置是否有效、恢复是否稳定。
十一、验证清单
完成本文实践后,可以用下面的清单自查。
11.1 数据链路
- Elasticsearch 中能查到目标索引或 data stream。
- 最近 15 分钟或 24 小时内有文档。
@timestamp与真实事件时间一致。- Logstash 输出字段符合预期。
- 没有明显重复采集。
11.2 Data View
- Data View pattern 匹配正确。
- 时间字段选择正确。
- 新字段刷新后可见。
- 常用 keyword、number、date 字段类型正确。
- 普通用户具备只读和使用权限。
11.3 Discover
- 能用 KQL 查到错误日志。
- 表格展示字段适合排障。
- 常用查询已保存。
- 抽样日志能解释 Dashboard 中的聚合结果。
11.4 Lens 和 Dashboard
- 日志量趋势能显示。
- 错误数和错误率能显示。
- Top 服务、Top 主机、Top URL 维度稳定。
- 慢请求或耗时面板单位清晰。
- Dashboard 默认时间范围合理。
- Controls 不会引入误导性过滤。
- Saved Discover 明细可以从 Dashboard 下钻。
十二、常见误区
误区一:先做 Dashboard,后治理字段。 这会导致图表反复返工。正确顺序是先稳定字段和类型,再做可视化。
误区二:所有人共用一个大 Dashboard。 不同角色关注点不同。值班、开发、SRE、安全、管理层应该有不同页面或至少不同区域。
误区三:把 Dashboard 当报表系统。 Kibana 擅长交互式探索和近实时分析,不适合承载所有固定格式报表需求。周期性管理报表可以从 Elasticsearch 导出或接入 BI 工具,但排障现场应保留 Kibana 的交互能力。
误区四:忽略时间字段。
日志进入 Elasticsearch 的时间和事件发生时间可能不同。如果 Logstash date filter 没有正确覆盖 @timestamp,Dashboard 会把旧日志显示在写入时间,影响事故判断。
误区五:直接聚合原始 message。
message 适合搜索和查看上下文,不适合做 Top N。应提取 error.type、url.route、service.name 等结构化字段。
十三、生产落地:让 Dashboard 进入日常工作流
入门 Dashboard 做完以后,真正的挑战是让它进入团队日常,而不是停留在“演示时很好看”。生产环境中的 Kibana 页面要服务三个动作:发布前后观察、告警后的快速定位、事故后的复盘改进。每一个动作对图表的要求不同,因此需要把 Dashboard 和流程绑定起来。
13.1 发布观察页面
每次应用发布后,值班人员最关心的不是所有历史趋势,而是发布窗口内的变化。可以单独建立一个“发布观察”Dashboard,默认时间范围设置为最近 2 小时,面板围绕发布影响组织:
| 面板 | 观察问题 | 推荐过滤或维度 |
|---|---|---|
| 请求量趋势 | 发布后流量是否恢复 | service.name、service.environment |
| 5xx 错误率 | 是否引入服务端错误 | http.response.status_code >= 500 |
| 4xx 分布 | 是否出现接口兼容问题 | http.response.status_code >= 400 and < 500 |
| P95/P99 耗时 | 是否引入性能退化 | event.duration 或业务耗时字段 |
| 错误日志明细 | 是否有新异常堆栈 | log.level: "ERROR" |
| Top URL 变化 | 是否某个接口异常集中 | url.route 或规范化路径 |
发布观察页面应尽量少放“长期容量类”面板,例如 30 天日志总量、月度错误分布。这类面板适合周报或容量分析,不适合发布当晚判断是否回滚。发布观察的核心是对比发布前后,发现新增错误、错误率突变、延迟抬升和请求分布异常。
这张流程图把 Kibana 嵌入发布动作中。Dashboard 不负责决定是否回滚,但它必须提供足够快的证据:异常是否出现、是否扩大、是否与发布窗口重合。
13.2 日志质量治理
Dashboard 使用一段时间后,团队会发现很多问题不是图表问题,而是日志质量问题。建议每周或每两周做一次日志质量 review,重点看以下指标:
| 治理项 | 低质量表现 | 改进方向 |
|---|---|---|
| 服务名 | 同一服务多个名称 | 统一 service.name |
| 环境名 | prod、production、prd 混用 | 统一 service.environment |
| 错误类型 | 只有原始堆栈,没有分类字段 | 增加 error.type 或 event.action |
| URL | 带大量动态 ID | 增加 url.route |
| 耗时 | 字段单位不明确 | 字段命名或格式注明单位 |
| Trace | 日志与链路无法关联 | 写入 trace.id、transaction.id |
| 多行日志 | 堆栈被拆散 | 在采集端或 Logstash 合并多行 |
这些治理动作不一定在 Kibana 中完成,但 Kibana 会持续暴露它们。比如 Top URL 面板被订单号冲散,说明路径没有归一化;错误明细只有 NullPointerException,却不知道业务动作,说明应用日志缺少上下文字段;同一个服务在 Dashboard 中出现多个名字,说明部署配置或日志格式没有统一。
日志质量治理的判断标准也很简单:一个没有参与过该服务开发的人,能否通过 Dashboard 和 Discover 在 5 到 10 分钟内回答“哪个服务、哪个接口、哪个版本、哪个主机、什么错误、影响多大”。如果答案是否定的,就应该回到日志字段和采集规范,而不是继续堆面板。
验收时还可以让一名非系统负责人按告警消息进入页面,独立完成筛选、下钻和证据截图。只要他需要反复询问字段含义,就说明 Dashboard 还没有真正产品化。
日志质量 review 也要留下结果。哪些字段要改名,哪些面板要下线,哪些查询要保存,哪些服务需要补 trace.id,都应形成任务,而不是停留在会议讨论。Kibana 暴露的是数据问题,修复动作通常分散在应用日志规范、Filebeat 配置、Logstash pipeline、Elasticsearch 模板和 Dashboard 对象之间。没有任务闭环,下一次事故还会遇到同样的问题。
13.3 团队复用与交接
Kibana 页面一旦成为排障入口,就需要像运维脚本和配置文件一样管理。至少要做到:
- 关键 Dashboard 有负责人。
- 页面标题能看出环境、系统和用途。
- 面板标题写清楚指标口径,例如“5xx 错误率”不要写成“错误”。
- 重要过滤条件写在面板说明或 Dashboard 描述中。
- 变更前导出 Saved Objects。
- 下线索引或字段前先确认 Dashboard 依赖。
对于值班交接,可以把 Dashboard 与 runbook 关联起来。例如告警消息中直接附上 Kibana Dashboard 链接、默认时间范围和服务过滤条件;事故复盘中记录当时使用了哪些面板、哪些面板误导了判断、哪些字段缺失导致定位变慢。这样 Kibana 页面会随着真实故障不断演进,而不是由某个人一次性设计后长期无人维护。
13.4 从日志 Dashboard 走向可观测性视图
日志只是可观测性的一部分。成熟团队会逐步把日志、指标、链路、变更记录关联起来。Kibana 可以先从日志侧提供稳定入口,再逐步和 Metricbeat、APM、Uptime、告警、变更系统联动。
一个常见演进路线如下:
这条路线的关键是“关联字段”。日志里有 trace.id,才能跳到链路;日志里有 host.name 和 service.name,才能和主机指标、容器指标对齐;日志里有版本号或部署批次,才能判断异常是否由变更引入。Kibana 可视化入门阶段就应养成这种字段意识,否则后续接入 APM 和告警时会发现数据彼此孤立。
总结
Kibana 可视化的核心不是“会拖图表”,而是把日志平台的数据链路变成可验证的分析闭环。Data View 决定 Kibana 能看到什么,Discover 用来验证数据和字段,Lens 负责把字段转换为趋势、分布和指标,Dashboard 则把团队的排障路径固化为可复用页面。
对于刚完成 Elasticsearch 和 Logstash 部署的团队,建议先做一个小而完整的生产日志巡检 Dashboard:日志量趋势、错误数、错误率、P95 响应时间、Top 服务、Top URL、错误明细。只要这个页面能稳定回答“有没有异常、异常在哪里、证据是什么”,它就比一个堆满面板但没人能解释的大屏更有价值。
下一篇将进入《Filebeat 日志采集》,把采集端前移到业务服务器,解决“如何轻量、稳定、标准化地把文件日志送入 Elastic Stack”的问题。到那一步,本文里的 Data View、字段类型、时间范围和 Dashboard 口径会反过来约束采集端:Filebeat 不是只把文件发出去,还要让进入 Kibana 的数据能被团队读懂、筛选和复盘。
如果后续 Dashboard 口径发生变化,也要同步更新采集和解析规则。可视化不是链路末端的装饰,它会反向定义哪些日志字段真正有运营价值,哪些字段只是存储成本,也会暴露团队是否具备稳定排障语言。
这也是 Kibana 入门后最应该保留的工作习惯,并且要写进团队交接文档和事故复盘记录中。