温馨提示×

linux golang日志怎样分析

小樊
41
2026-09-05 15:04:15
栏目: 编程语言

在 Linux 环境下使用 Go (Golang) 写服务时,日志分析通常分为 日志产生 → 日志收集 → 日志分析 → 问题定位 几个阶段。下面从实践角度系统讲一下。


一、Go 日志怎么打(先确保可分析)

1. 标准库(不推荐生产)

log.Println("something happened")

缺点:没有级别、没有结构化、不好检索。

2. 推荐结构化日志库

常用:

  • zap(Uber,性能好)
  • logrus(易用)
  • slog(Go 1.21+ 官方)

zap 示例

logger, _ := zap.NewProduction()
defer logger.Sync()

logger.Info("user login",
    zap.String("user", "tom"),
    zap.Int("uid", 1001),
)

输出:

{"level":"info","ts":1710000000.123,"msg":"user login","user":"tom","uid":1001}

✅ 结构化日志是后续分析的基础


二、Linux 下日志文件管理

1. 输出到文件

./app > app.log 2>&1

或使用 systemd:

StandardOutput=append:/var/log/app/app.log
StandardError=append:/var/log/app/app.log

2. 日志轮转(非常重要)

logrotate

/var/log/app/*.log {
    daily
    rotate 7
    compress
    missingok
    notifempty
}

三、基础日志分析命令(Linux)

1. 实时查看

tail -f app.log

2. 错误过滤

grep -i error app.log

3. 统计错误次数

grep ERROR app.log | wc -l

4. 按时间区间

awk '$1 >= "2024-03-01" && $1 <= "2024-03-02"' app.log

5. JSON 日志分析(jq)

cat app.log | jq 'select(.level=="error")'

四、Go 常见日志分析场景

1. Panic / 崩溃分析

grep -A 20 panic app.log

配合:

defer func() {
    if r := recover(); r != nil {
        log.Printf("panic: %v", r)
    }
}()

2. 接口耗时分析

日志中打耗时:

start := time.Now()
// ...
logger.Info("http request",
    zap.String("path", "/login"),
    zap.Duration("cost", time.Since(start)),
)

分析慢接口:

jq 'select(.cost > 500000000)'

3. 用户行为分析

jq 'select(.msg=="user login") | .user' app.log | sort | uniq -c

五、进阶:日志集中分析(生产推荐)

方案 1:ELK

  • Filebeat 收集
  • Elasticsearch 存储
  • Kibana 可视化

适合:

  • 多服务
  • 大规模日志

方案 2:Loki + Grafana

  • 轻量
  • 和 Prometheus 搭配好
  • 适合云原生

方案 3:ClickHouse

  • 超大数据量
  • SQL 分析日志

六、Go 日志分析最佳实践总结

✅ 使用结构化日志(zap / slog)
✅ 日志包含:时间、级别、trace_id、关键参数
✅ Linux 下必须做 logrotate
✅ 错误日志单独通道
✅ 小项目:grep + jq
✅ 大项目:ELK / Loki


如果你愿意,可以告诉我:

  • 你的 Go 日志库
  • 单机还是 k8s
  • 主要想分析 错误 / 性能 / 业务

我可以直接给你一套 可落地的日志方案 + 示例配置

0