日志聚合指南

日志栈对比

组件最适合成本
ELKElasticsearch + Logstash + Kibana全文搜索、复杂查询、大规模高(资源消耗大)
EFKElasticsearch + Fluentd + KibanaK8s 原生、结构化日志
PLG (Loki)Prometheus + Loki + GrafanaK8s、标签化、成本高效
Vector + ClickHouseVector + ClickHouse + Grafana高吞吐量、SQL 分析

结构化日志(Go)

// 使用 slog(Go 1.21+) logger := slog.New(slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{ Level: slog.LevelInfo, })) // 结构化日志条目 logger.Info("请求已处理", slog.String("method", "GET"), slog.String("path", "/api/users"), slog.Int("status", 200), slog.Duration("latency", 45*time.Millisecond), slog.String("trace_id", traceID), ) // 输出: // {"time":"...","level":"INFO","msg":"请求已处理","method":"GET","status":200}

Loki LogQL 示例

# 流选择器(标签) {app="my-app", env="production"} # 过滤错误日志 {app="my-app"} |= "error" # 正则过滤 {app="my-app"} |~ "ERR|FATAL" # 解析 JSON 日志 {app="my-app"} | json | status >= 500 # 每分钟错误日志速率 rate({app="my-app"} |= "error" [1m]) # 请求量最多的路径(过去 1 小时) topk(10, sum by (path) ( count_over_time({app="api"} | json [1h]) ))