Go 日志收集与聚合:Loki + Promtail + Grafana 全攻略
日志和 metrics 同等重要。本文讲 Go 项目中如何采集日志,并接入 Loki + Grafana。
一、Go slog 输出
import"log/slog"import"os"logger:=slog.New(slog.NewJSONHandler(os.Stdout,nil))slog.SetDefault(logger)slog.Info("user login","user_id",42)输出:
{"time":"2026-07-30T08:00:00Z","level":"INFO","msg":"user login","user_id":42}二、容器内 Promtail 采集
Pod spec:
spec:containers:-name:appimage:myapp-name:promtailimage:grafana/promtailargs:--config.file=/etc/promtail/promtail.yamlvolumeMounts:-name:logsmountPath:/var/log-name:promtail-configmountPath:/etc/promtailpromtail.yaml:
server:http_listen_port:9080positions:filename:/tmp/positions.yamlclients:-url:http://loki:3100/loki/api/v1/pushscrape_configs:-job_name:appstatic_configs:-targets:[localhost]labels:job:myapp__path__:/var/log/messages三、JSON 解析
Promtail 用pipeline_stages解析 JSON:
scrape_configs:-job_name:appstatic_configs:-targets:[localhost]labels:job:myapp__path__:/var/log/*.logpipeline_stages:-json:expressions:level:levelmsg:msgtrace_id:trace_id四、Loki 查询
curl-Ghttp://loki:3100/loki/api/v1/query\--data-urlencode'query={job="myapp"}'\--data-urlencode'time=2026-07-30T08:00:00Z'五、Grafana 关联 Trace ID
dashboard 添加 Loki 面板,用{trace_id="xxx"}直接跳转 Tempo。
六、企业实战:高吞吐量日志
- 单 Pod print 直接打 stdout/stderr
- Promtail sidecar 收集
- 不持久保存非生产日志
七、Fluent Bit 替代方案
-input:type:tailpath:/var/log/app.log-output:type:lokihost:lokiport:3100八、ELK 仍是参考
重型方案:
- logstash 收集 → ES 存储 → Kibana 看板
轻量方案:
- Promtail → Loki → Grafana
九、企业实战:日志收集架构
app stdout → docker driver → node agent → Kafka → Logstash → ES → Kibana适合:复杂监控。
十、SLF 在 Go 中的应用
import"github.com/sirupsen/logrus"log.SetFormatter(&log.JSONFormatter{})log.SetOutput(os.Stdout)log.Info("user login")十一、踩坑清单
- 大块 JSON:查询变慢
- 敏感数据打印:密码 / token 屏蔽
- 日志时间与系统时间:用 UTC
十二、未来
- AI 异常日志自动归类
- 关联 RCA 流程
十三、总结与展望
日志体系是 SRE 的"第一手材料"。Go + Promtail + Loki + Grafana 是当下一套标准工具链。
未来:可观测性平台统一 OpenTelemetry,AI 自动异常检测。
十四、参考文献
- Promtail 文档
- Loki 文档
- Grafana 文档