用Loki把服务日志收拢查询的方案

举报
静水流深-云海 发表于 2026/09/30 14:19:31 2026/09/30
【摘要】 机器一多,tail 日志就不现实了;上 ELK 又觉得重。这篇用 Loki + Promtail + Grafana 搭一套轻量日志方案:Promtail 在各机采集、Loki 按标签存、Grafana 用 LogQL 查,重点讲清标签模型、查询语法和几个容易踩的坑。

服务一多,查问题就变成"先 ssh 到哪台机器、再 tail 哪个文件",几台还好,几十台就别想了。很多人第一反应是上 ELK,但 ELK 对中小团队偏重。后来我用了 Loki,它的思路很取巧:只索引标签、不索引全文,成本低、和 Prometheus/Grafana 同一套生态。这篇把最小可用的玩法讲清楚。

image.png

一、三个组件各管啥

  • Promtail:部署在被采集机器上,读日志文件、打上标签(job、app 名),推给 Loki。
  • Loki:接收并存储,按标签建索引。
  • Grafana:连上 Loki 数据源,用 LogQL 查询、画面板。

最快的起法是用 docker-compose 一把拉起 Loki + Promtail + Grafana,本地就能调通。

二、Promtail 怎么配

核心是 scrape_configs,告诉它"盯哪些文件、打什么标签":

scrape_configs:
  - job_name: app
    static_configs:
      - targets: [localhost]
        labels:
          job: app
          app: order-service
          __path__: /var/log/order/*.log

__path__ 是 Promtail 约定的字段,表示要采集的文件路径;其余标签(job、app)会跟着每条日志走,后面查询就靠它们过滤。

三、在 Grafana 里查

连好 Loki 数据源后,查询框里写 LogQL。最基础:

{job="app", app="order-service"}

只看 error 级别,用管道过滤:

{job="app"} | json | level="error"

| json 会把日志当成 JSON 解析出字段,level="error" 再过滤。要算每分钟错误数:

count_over_time({job="app"} | json | level="error" [1m])

Loki 和 ELK 的取舍:

维度 Loki ELK
索引方式 只索引标签 全文索引
存储成本 低 高
查询语言 LogQL KQL/Lucene
生态 与 Prometheus/Grafana 一体 自成体系
全文模糊搜 弱(靠标签+管道) 强

所以 Loki 适合"按服务/级别快速定位日志",如果你要做全文内容检索,ELK 仍更合适。

几个容易踩的

  • label 别打太多太细。比如把 user_id 当标签,基数爆炸,Loki 索引会撑爆。标签只放"有限枚举"的维度(服务名、环境、级别),用户级维度放日志内容里用管道查。
  • 只索引标签意味着全文搜弱。别指望 |= "某段罕见文本" 很快,它本质是在标签过滤后的结果里做行内匹配。定位思路应该是"先用标签缩小范围,再在结果里搜"。
  • 保留期要设。Loki 存多久、多大,配置里定好,不然磁盘慢慢被日志吃满。
  • 时钟要同步。多机日志靠时间排序,机器时间差太多,查出来的顺序会乱,NTP 同步别省。

Loki 的价值在于"轻量地把分散日志聚起来、用标签快速筛"。它不是 ELK 的替代品,但对多数"按服务查日志"的场景已经够用,还顺手和你的 Prometheus 监控共用一套 Grafana。先把 Promtail 标签打对,后面查询就顺了。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。