如何使用Go语言连接Grafana Loki并获取其存储的日志数据?
Go 语言拉取 Loki 日志开发入门
1. 开发切入点说明
你已经持有全部所需标签的前提下,核心开发路径分为三步:初始化客户端、构造查询参数、解析返回结果。优先选择 Loki 官方提供的 Go 语言 SDK 开发,无需自行处理签名、请求构造等底层逻辑,门槛最低。
2. 依赖准备
首先安装官方 SDK 依赖:go get github.com/grafana/loki/pkg/logcli/client
如果不想引入第三方依赖,也可以直接调用 Loki 的原生 HTTP 接口 /loki/api/v1/query_range,用标准库 net/http 发送请求即可。
3. 最简可运行示例
package main import ( "context" "fmt" "time" "github.com/grafana/loki/pkg/logcli/client" "github.com/grafana/loki/pkg/loghttp" "github.com/grafana/loki/pkg/logproto" ) func main() { // 初始化 Loki 客户端,替换为你实际的 Loki 服务地址 lokiClient := &client.Client{ Address: "http://127.0.0.1:3100", // 若服务开启 Basic 认证,补充下方配置 // Username: "xxx", // Password: "xxx", } // 你已有的标签直接拼接为 LogQL 选择器,按实际标签替换即可 logQLSelector := `{service="your-service", namespace="your-namespace", env="prod"}` // 配置查询时间范围,示例为查询最近1小时日志 endTime := time.Now() startTime := endTime.Add(-1 * time.Hour) // 单次查询最大返回日志条数 maxLimit := 100 // 发起范围查询请求 queryResp, err := lokiClient.QueryRange( context.TODO(), logQLSelector, maxLimit, startTime, endTime, logproto.FORWARD, // 按时间正序返回,填 logproto.BACKWARD 为倒序 0, 0, false, ) if err != nil { fmt.Printf("Loki 查询失败:%v\n", err) return } // 解析返回结果 streamResult, ok := queryResp.Data.Result.(loghttp.Streams) if !ok { fmt.Println("返回结果格式不符合预期") return } // 遍历输出日志,可按业务需求自行处理存储、过滤逻辑 for _, stream := range streamResult { fmt.Printf("\n===== 对应标签组:%s =====\n", stream.Labels.String()) for _, entry := range stream.Entries { fmt.Printf("[%s] %s\n", entry.Timestamp.Format(time.RFC3339Nano), entry.Line) } } }
4. 注意事项
- 日志量较大的场景下,不要一次性拉取过长时间范围的日志,建议按分钟/小时分片拉取,避免请求超时或内存占用过高
- 若需要对日志内容做过滤、字段解析,优先直接在 LogQL 中添加管道处理逻辑,比拉取到本地再处理效率高很多
- 如果 Loki 服务配置了 API Token 认证,可以自行封装 HTTP 客户端,在请求头中添加
Authorization: Bearer <你的Token>即可
内容的提问来源于stack exchange,提问作者Quentin
相关产品推荐
相关产品推荐

