Grafana 系列文章(十二):如何使用 Loki 创建一个用于搜索日志的 Grafana 仪表板
本文最后更新于:2024年7月25日 下午
概述
创建一个简单的 Grafana 仪表板,以实现对日志的快速搜索.
有经验的直接用 Grafana 的 Explore 功能就可以了.
但是对于没有经验的人,他们如何能有一个已经预设了简单的标签搜索的仪表板,以帮助一些团队在排除故障时快速找到他们正在寻找的东西。虽然 Explore 很适合这个用例,但对于第一次使用的人,或者半夜收到告警的人来说,也可能有点令人生畏。
所以,尝试通过一些模板变量来创建一个展示日志的 Grafana 仪表板.
步骤
实现概述
创建个 Logs Panel 的仪表板,然后添加几个变量,Logs Panel 的 LogQL 表达式引入这些变量.
创建变量
因为 Loki 和 Prometheus 共享一套 Label, 所以可以通过 Prometheus 的 Label 来作为 Loki 的变量。如下图:

这里创建一个可以通过: namespace, pod, 日志过滤条件 筛选日志的仪表板:
namespace变量,通过该变量获取所有的namespace作为变量筛选条件:- Type:
Query - DataSource: Prometheus
- Query:
label_values(kube_pod_info, namespace)
- Type:
pod变量,通过该变量获取对应namespace下的pod作为变量筛选条件以缩小日志搜索空间:- Type:
Query - DataSource: Prometheus
- Query:
label_values(container_network_receive_bytes_total{namespace=~"$namespace"},pod) - Multi-value: 勾选;
- Include All option: 勾选
- Custom all value:
.* - 🐾注意,使用
container_network_receive_bytes_total作为指标名称来寻找可用的 pod,但你可以使用任何指标来代表你环境中的所有 pod。
- Type:
search变量,通过该变量作为 LogQL 的管道过滤条件,它被用来实际执行搜索:- Type:
Text Box - Default value:
rror(命中Error或error)
- Type:
执行 LogQL
最后,把上面的变量串联起来,添加 Logs Panel, 使用 Loki 作为数据源,并使用 {namespace="$namespace", instance=~"$pod"} |~ "$search" 作为 LogQL. 如下:

所有这些加在一起,提供了一个漂亮而简单的搜索日志的界面–不熟悉的人甚至不需要写一个 LogQL 查询!
再做一个查看 Journal 日志的
同样,再做一个查看 Journal 日志的:
创建变量
这里直接使用 Loki 的 Label.
这里创建一个可以通过: hostname, unit, 日志过滤条件 筛选日志的仪表板:
hostname变量,通过该变量获取所有的hostname作为变量筛选条件:- Type:
Query - DataSource: Loki
- Query:
label_values(hostname) - Multi-value: 勾选
- Include All option: 勾选
- Custom all value:
.+
- Type:
unit变量,通过该变量获取对应hostname下的unit作为变量筛选条件以缩小日志搜索空间:- Type:
Query - DataSource: Loki
- Query:
label_values({hostname=~"$hostname"}, unit) - Multi-value: 勾选;
- Include All option: 勾选
- Custom all value:
.+ - 🐾注意,使用
container_network_receive_bytes_total作为指标名称来寻找可用的 pod,但你可以使用任何指标来代表你环境中的所有 pod。
- Type:
search变量,通过该变量作为 LogQL 的管道过滤条件,它被用来实际执行搜索:- Type:
Text Box - Default value:
rror(命中Error或error)
- Type:
执行 LogQL
最后,把上面的变量串联起来,添加 Logs Panel, 使用 Loki 作为数据源,并使用 {hostname=~"$hostname", unit=~"$unit"} |~ "$search" 作为 LogQL. 如下:

最终效果
最终效果如下:

和如下:

🎉🎉🎉