日志聚合指南
日志栈对比
| 栈 | 组件 | 最适合 | 成本 |
|---|---|---|---|
| ELK | Elasticsearch + Logstash + Kibana | 全文搜索、复杂查询、大规模 | 高(资源消耗大) |
| EFK | Elasticsearch + Fluentd + Kibana | K8s 原生、结构化日志 | 高 |
| PLG (Loki) | Prometheus + Loki + Grafana | K8s、标签化、成本高效 | 低 |
| Vector + ClickHouse | Vector + 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])
))