3 个场景跑通 Loki API从推送第一条日志到查询错误趋势【免费下载链接】lokiLike Prometheus, but for logs.项目地址: https://gitcode.com/GitHub_Trending/lok/loki如果你刚接触 Loki大概率会问两件事日志怎么写进去写进去之后怎么查其实答案就藏在它的 RESTful 接口里。Loki 是一个像 Prometheus 那样为日志设计的开源聚合系统而 Loki API 就是你和它打交道的全部入口——通过几个/loki/api/v1/开头的端点你既能完成 Loki 日志推送也能用 Loki LogQL 查询LogQL 是 Loki 的日志查询语言语法和 PromQL 很像检索数据还能做 Loki 标签管理摸清日志流的结构。动手前先记住这三件事在敲第一条 curl 之前把下面三条约定刻进脑子后面所有请求都绕不开它们。基础路径所有端点都挂在/loki/api/v1/之下Loki 默认监听 3100 端口所以本地环境的完整前缀通常是http://localhost:3100/loki/api/v1/。两种数据格式多数请求接受application/json方便人读写入类接口同时支持application/x-protobufProtocol Buffers一种比 JSON 更紧凑的二进制序列化格式客户端库在追求吞吐时通常走这条路。三种压缩请求体可以用gzip、deflate或snappy压缩用Content-Encoding头告知 Loki 怎么解开。日志量一大压缩能省掉一大半带宽。这三点搞清楚后就可以进入实战了。场景一把日志写进 Loki 这一步在干嘛往/loki/api/v1/push发一个 POST把若干条日志按标签流批量塞进 Loki。推送请求的结构很直观一个streams数组每个流由两部分组成——stream是这组日志的标签集合相当于这个流的身份证values是日志条目数组每条是[时间戳, 日志内容]。{ streams: [ { stream: { job: demo, host: server-01 }, values: [ [1623456789000000000, ERROR: Failed to connect to database], [1623456790000000000, WARN: High memory usage detected] ] } ] }把它变成一条可运行的 curlcurl -X POST http://localhost:3100/loki/api/v1/push \ -H Content-Type: application/json \ -d { streams: [ { stream: { job: demo, host: server-01 }, values: [ [$(date %s%N), Hello from Loki API] ] } ] }注意一个高频坑时间戳单位是纳秒。示例里1623456789000000000有 19 位如果你随手丢进去一个 10 位的秒级时间戳这条日志要么报错、要么排到时间线的史前位置。shell 里date %s%N正好给出纳秒值。场景二把日志查出来 这一步在干嘛用 LogQL 从 Loki 里把日志捞出来。Loki 提供两个查询端点区别在于你要一个点还是一段线。对比项/loki/api/v1/query/loki/api/v1/query_range回答的问题某个时刻附近发生了什么一段时间内趋势如何变化关键参数time查询时间点、limit返回条数默认 100start/end/step范围与步长典型用途排查现在/刚才的具体报错统计错误量随时间的变化两者都接收query参数放 LogQL 语句GET 和 POST 均可URL 里的特殊字符记得做百分号编码{→%7B→%22。先查一个点——拿最近 10 条 api-server 的 error 日志curl http://localhost:3100/loki/api/v1/query?query%7Bjob%3D%22api-server%22%7D%20%7C~%20%22error%22limit10time$(date %s)再查一段趋势——统计过去一小时每分钟 error 的条数curl http://localhost:3100/loki/api/v1/query_range?querysum(count_over_time(%7Bjob%3D%22api-server%22%7D%20%7C~%20%22error%22%5B1m%5D))start$(date -d 1 hour ago %s)end$(date %s)step60两者的响应外壳一致status为success时data.result里装着结果流式查询的结果会带上来源流的标签和[时间戳, 内容]列表方便你确认日志出自哪里。场景三看懂标签系统️ 这一步在干嘛在写复杂查询之前先搞清楚自己库里有哪些抽屉——标签就是 Loki 的索引结构作用相当于字典的索引页先翻标签名/loki/api/v1/labels再查某个标签下有哪些值/loki/api/v1/label/name/values最后带着{jobapi-server}这样的选择器去查日志检索效率完全不同。curl http://localhost:3100/loki/api/v1/labels # 返回类似 {status:success,data:[job,environment,host]} curl http://localhost:3100/loki/api/v1/label/job/values # 返回类似 {status:success,data:[api-server,frontend,database]}这也是排查为什么查不到数据的第一站多半是标签名或值写错了。排错速查遇到非 2xx 响应按这张表先自查状态码含义先检查什么400请求体格式错误JSON 是否合法、时间戳是否纳秒、标签是否合法401认证失败API Key / Token 是否配置正确429触发限流降频或调大 Loki 的限流阈值500服务端内部错误翻 Loki 自身日志定位根因提速清单批量推送一次请求塞满一个批次的流别一条日志一个请求单请求控制在 1MB 以内。收敛标签基数每个流保留 5-10 个标签把 request_id、用户 ID 这类高基数取值种类随数据量无限膨胀信息放日志正文或结构化字段别塞进标签。开启压缩推送侧加gzip网络开销立降客户端库默认都会做。非关键日志异步推对实时性不敏感的数据走异步队列避免拖慢主流程。写在最后回顾一下今天的三件事/loki/api/v1/push负责写/loki/api/v1/query与/loki/api/v1/query_range分别负责查一个点和查一段趋势/loki/api/v1/labels两个端点负责摸清标签索引。想深入细节看仓库里的官方文档API 与接口示例docs/sources/query/LogQL 查询语言docs/sources/query/log_queries/日志解析与处理管道stagesclients/pkg/logentry/推送接口实现pkg/loghttp/push/端点就这几个跑通一遍Loki 的大门就开着了。【免费下载链接】lokiLike Prometheus, but for logs.项目地址: https://gitcode.com/GitHub_Trending/lok/loki创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考