上一节给大家对Loki进行了介绍,了解了其存储日志、查询日志的相关组件及原理。这一节将会带领大家实际地完成Loki、Promtail的部署,完成服务日志的采集,以及在grafana上查询日志的使用介绍。
下图描述了日志平台日志采集和查询的数据流,在本章节我们将会完成PromTail、Loki的部署,然后在Grafana上配置Loki数据源完成日志的查询。

Loki Chart部署
在Loki的代码仓库中production目录提供了Loki Helm部署的Chart包,其中也提供了日志采集端fluent-bit、promtail等组件的Chart部署包。
部署Loki时,只需要对Values文件中依赖的存储进行配置即可完成默认安装:
storage:
s3:
accessKeyId: null
endpoint: null
http_config: {}
insecure: false
region: null
s3: null
s3ForcePathStyle: false
secretAccessKey: null
signatureVersion: null
type: s3
如果进行demo学习可以将type配置为filesystem,但是此时的副本数只能设置为1。
我们这里demo部署的是单二进制模式(如果需要完成分布式的部署,仅需要打开其他的配置开关即可),设置singleBinary.replicas为1
singleBinary:
# -- Number of replicas for the single binary
replicas: 1
运行命令完成部署
helm install --namespace=log-demo loki loki/
完成部署后,单机模式的Loki将会以statefulset运行,同时还会部署一个以Nginx作为网关。在分布式模式,Nginx将会分别反向代理读写请求至Query Fronted和Distributor。

Promtail Chart部署
Promtail 的Chart只需要完成配置日志写入Loki的接口地址即可完成部署:
config:
clients:
- url: http://loki-gateway.log-demo.svc.cluster.local:80/loki/api/v1/push
由于Promtail与Loki部署在一个集群内,所以只需要配置访问到loki-gateway的service即可。
Promtail将会以Daemonset形式运行在每个Node上,采集K8s集群中运行的服务输出在控制台的日志。

Grafana 配置Loki数据源
在Grafana的数据源管理页面选择添加Loki类型数据源

填入名称,查询地址 http://loki-gateway.log-demo.svc.cluster.local:80

点击save&test按钮完成数据源配置。
Grafana 查询日志
点击首页的探索(Explore),选择配置的Loki数据源即可开始查询日志,在链路跟踪章节中我们实现的Go demo 程序会输出日志,我们对这个命名空间的日志进行查询

可以看到我们在日志中传入了TraceID, 这样可以结合日志输出和链路跟踪对服务问题进行排查了。
如果对Loki提供的LogQL比较熟悉,也可以通过切换右侧的BuilderCode来选择输入查询语句方式:

新手建议Builder结合Code进行使用,基于界面的交互能够降低查询的学习门槛。
使用LogQL查询Json日志
这里带来一个使用LogQL查询的示例。在Go Demo的server1服务中,不知道大家还是否记得在Trace中有个模拟异常输出的日志。

在Demo中日志的输出是Json格式的,这行日志内容为:
{"TraceID":"283867f7da0f32b5ad14848f37ed58a8","description":"sending go-server2","file_line":"server1/main.go:54","level":"error","service":"go-demo-server1","timestamp":"2023-10-21T14:24:02.103+0800","version":"v0.0.1"}
而我们通过grafana的Label filter下拉选项是没有这行日志中Json的Key的。

常见的,我们需要根据日志级别筛选日志、或者根据TraceID查询日志该如何通过LogQL实现呢?
首先我们通过管道运算符将采集的日志整体转化为Json
{namespace="go-optl-demo", component="server1"} | json
我们应用输出的日志在log字段,我们再将log字段转化为Json
{namespace="go-optl-demo", component="server1"} | json | line_format `{{.log}}` | json
这样,应用程序本身输出的字段就可以通过label filters进行过滤了

以上过程也可以通过界面完成设置,大家在使用过程中Builder结合Code使用更能加快对LogQL的理解

关于LogQL更多的查询技巧,大家可以在Grafana官网中Loki章节查询示例进行学习了解。
到这里就完成了Loki整体的搭建,大家可以在Grafana完成链路、日志的查询了,而不需要多个应用进行切换了。

而通过grafana看板查看Prometheus监控指标想必大家都比较熟悉了,那只需要Grafana一个前端应用就可以完成监控、日志、链路跟踪数据的查询,能够提升查找分析问题的效率。
往期回顾:
Grafana全家桶(四)链路跟踪Demo-Go代码集成opentelemetry SDK
Grafana全家桶(三)使用Grafana Agent与Tempo实现链路追踪完整demo




