从零跑通 Loki 日志读写:3条 curl 命令搞定
【免费下载链接】lokiLike Prometheus, but for logs.项目地址: https://gitcode.com/GitHub_Trending/lok/loki
Loki 是 Grafana Labs 出品的开源日志聚合系统,口号是"Like Prometheus, but for logs"——你把日志推给它,再用 LogQL 查询语言把它捞回来。全文只干一件事:用三条 curl 命令,把"写入 → 查询 → 标签"这条核心链路跑通。
⚡ 快速认知
把 Loki 想成"日志界的收件箱":每条日志贴一张"标签便签"(比如job=api-server),所有贴同一张便签的日志自动归成一"流"。你不用建索引,按标签查就行,这也是它比传统搜索引擎省资源的关键。
🔧 动手:用 curl 推送第一条日志
先起一个 Loki(本地单条命令即可,docker run -p 3100:3100 grafana/loki),然后回答一个问题:我的应用日志怎么进去?答案就是 POST 到/loki/api/v1/push:
curl -X POST http://localhost:3100/loki/api/v1/push \ -H "Content-Type: application/json" \ -d '{ "streams": [ { "stream": { "job": "demo", "host": "server-01" }, "values": [ [ "1728000000000000000", "Hello from Loki API" ] ] } ] }'你会看到:没有任何响应体,HTTP 204。成功就是"没话说"——push 接口设计上不返回内容。
常见坑:请求体里values的时间戳写成秒级(1728000000)会查不到数据。Loki 要纳秒,18 位左右。少写 6 个 0 不会报错,只会让日志"消失"在很久以前的时间线上。
🚀 动手:把刚写入的数据查回来
现在问题来了:刚推的那条日志在哪?用即时查询/loki/api/v1/query,它只回答"某个时间点现在有什么":
curl "http://localhost:3100/loki/api/v1/query?query=%7Bjob%3D%22demo%22%7D&time=1728000000&limit=10"(%7B...%7D是 URL 编码后的{job="demo"})
你会看到:status为success,data.resultType是streams,result数组里每条流带着标签和[时间戳, 日志内容]对——就是你刚推的那句 "Hello from Loki API"。
如果要看一段趋势(比如每分钟错误数),换成范围查询/loki/api/v1/query_range,多加三个参数:start、end、step。一句话区分两者:query是"拍照",query_range是"录像"。
常见坑:time和start/end单位是秒,而 push 的时间戳是纳秒——同一篇文章里两个地方单位不同,是最容易栽的点。统一用date +%s生成秒级时间戳就不会错。
动手:看看仓库里有哪些标签
数据进多了以后,新人的第一个问题永远是:"我到底写了些啥?"两个接口解决:
curl http://localhost:3100/loki/api/v1/labels curl http://localhost:3100/loki/api/v1/label/job/values第一条列出所有标签名(job、host…),第二条列出指定标签下出现过的所有值(demo、server-01…)。你会看到:两个响应都是{"status":"success","data":[...]}的扁平数组,可以直接喂给下拉框做筛选 UI。
常见坑:标签返回的是全历史的并集,删了数据也不会从列表里消失。想要"当前还有哪些流",用/loki/api/v1/index/stats或直接看 Grafana 的 Explore。
踩坑速查
- 现象:push 返回 400原因:JSON 结构错,或
stream标签里带了空 key解法:先按上面的最小示例对着改,再逐步加字段 - 现象:push 204,查询一条都没有原因:时间戳单位写错(秒当成了纳秒),数据落在很久以前解法:push 用纳秒,查询用秒,各 18 位和 10 位
- 现象:日志在 Grafana 里能查到,curl 查不到原因:query 参数没做 URL 编码,
{}"被 shell 或网关吃掉解法:用--data-urlencode "query={job=\"demo\"}"配合 POST - 现象:大批量推送返回 413原因:超过单次请求体大小限制解法:把批量拆小,每次不超过 1MB
- 现象:429 Too Many Requests原因:触发限流(ingestion rate limit)解法:客户端做退避重试,别硬刷
进阶线索
- pkg/loghttp/push/ —— 推送接口的解析入口,
PushRequest怎么从 HTTP body 变成内部结构都在这 - pkg/engine/ —— 查询引擎,
query/query_range背后真正干活的地方 - docs/sources/query/ —— 官方 LogQL 文档,想知道哪些函数能写进
query参数,翻这里
【免费下载链接】lokiLike Prometheus, but for logs.项目地址: https://gitcode.com/GitHub_Trending/lok/loki
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考