news 2026/9/4 14:12:10

从零跑通 Loki 日志读写:3条 curl 命令搞定

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
从零跑通 Loki 日志读写:3条 curl 命令搞定

从零跑通 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"}

你会看到:statussuccessdata.resultTypestreamsresult数组里每条流带着标签和[时间戳, 日志内容]对——就是你刚推的那句 "Hello from Loki API"。

如果要看一段趋势(比如每分钟错误数),换成范围查询/loki/api/v1/query_range,多加三个参数:startendstep。一句话区分两者:query是"拍照",query_range是"录像"。

常见坑timestart/end单位是,而 push 的时间戳是纳秒——同一篇文章里两个地方单位不同,是最容易栽的点。统一用date +%s生成秒级时间戳就不会错。

动手:看看仓库里有哪些标签

数据进多了以后,新人的第一个问题永远是:"我到底写了些啥?"两个接口解决:

curl http://localhost:3100/loki/api/v1/labels curl http://localhost:3100/loki/api/v1/label/job/values

第一条列出所有标签名(jobhost…),第二条列出指定标签下出现过的所有值(demoserver-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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/4 14:11:52

【单片机课程设计/毕业设计】基于 STM32/51 单片机的病房呼叫液晶显示报警系统设计 带有优先级机制的无线病床呼叫与环境监测系统设计(020206)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机,Java、小程序技术领域和毕业项目实战 ✌️…

作者头像 李华
网站建设 2026/9/4 14:11:13

Koodo Reader TTS 语音朗读从入门到个性化设置指南

Koodo Reader TTS 语音朗读从入门到个性化设置指南 【免费下载链接】koodo-reader A modern ebook manager and reader with sync and backup capacities for Windows, macOS, Linux, Android, iOS and Web 项目地址: https://gitcode.com/GitHub_Trending/koo/koodo-reader …

作者头像 李华
网站建设 2026/9/4 14:06:37

linux系统操作

含义:查看当前时间 date 含义:查看系统盘磁盘空间占用大小 df -h 含义:端口监听信息查看 netstat -lntp netstat -lntp | grep 80 含义:查看哪个进程在监听80端口 netstat -lntp | grep nginx 含义:查看nginx监听的…

作者头像 李华
网站建设 2026/9/4 14:04:09

什么是网络编程中的阻塞和非阻塞?它们有什么区别?

阻塞和非阻塞是在网络编程中经常听到的两个词。它们其实描述的是当一个程序在等待某些事情发生时,它会怎么做。阻塞:想象你正在给一个好朋友打电话,但你的朋友正在忙,没有接电话。如果你选择“阻塞”方式,那就意味着你…

作者头像 李华