温馨提示×

怎样分析linux golang日志

小樊
42
2026-10-05 11:49:16
栏目: 编程语言

分析 Linux 上 Golang 服务的日志,通常可以从日志来源、工具方法、分析思路、常见问题定位四个维度来做。下面给你一个比较系统的总结。


一、先明确日志来源

Golang 日志一般有几种形式:

  1. 标准输出 / 标准错误

    • fmt.Println
    • log.Println
    • 容器里通常是 stdout/stderr
  2. 日志文件

    • 自己写文件
    • 使用日志库(zap / logrus / slog)
  3. 系统层日志

    • journalctl(systemd 服务)
    • /var/log/messages
    • dmesg(OOM、崩溃)
  4. 运行时日志

    • panic / stack trace
    • pprof、trace

二、基础查看命令(Linux)

1. 实时查看

tail -f app.log
journalctl -u mygo.service -f

2. 过滤关键字

grep ERROR app.log
grep -i "timeout" app.log

3. 时间范围

sed -n '/2026-01-21 10:00/,/2026-01-21 11:00/p' app.log
journalctl --since "10 min ago"

4. 统计出现次数

grep ERROR app.log | wc -l

三、Golang 日志分析重点

1. 关注日志级别

建议日志中包含:

  • INFO
  • WARN
  • ERROR
  • FATAL

例如:

2026-01-21 10:12:33 ERROR db query failed: timeout

分析时优先看:

  • ERROR / FATAL
  • 连续 WARN

2. Panic 和 Stack Trace

Golang panic 示例:

panic: runtime error: invalid memory address
goroutine 1 [running]:
main.main()
    /app/main.go:23 +0x45

重点看:

  • 出错文件 + 行号
  • goroutine 状态(block / running / chan receive)

3. 并发问题线索

日志中常见信号:

  • 卡死(无新日志)
  • all goroutines are asleep
  • 锁等待时间长
  • context deadline exceeded

可结合:

go tool pprof
go tool trace

四、常用分析工具

1. 命令行工具

  • grep / awk / sed
  • less -S(不换行看长日志)
  • jq(JSON 日志)
cat app.log | jq 'select(.level=="error")'

2. 日志聚合(推荐)

如果是生产环境:

  • ELK(Elasticsearch + Logstash + Kibana)
  • Loki + Grafana
  • ClickHouse

适合:

  • 多实例
  • 长期分析
  • 告警

3. Golang 专用

  • zap / slog(结构化日志)
  • pprof
  • expvar
  • trace

五、典型问题排查思路

1. 服务启动失败

看:

  • panic
  • 配置加载错误
  • 端口占用
journalctl -u goapp.service

2. 接口变慢

看:

  • 请求耗时日志
  • context timeout
  • DB / RPC 日志

3. 内存上涨

  • 看 OOM(dmesg)
  • pprof heap

4. 偶发错误

  • 按 trace_id / request_id 聚合
  • 看是否和某台机器、某个时间相关

六、建议的日志规范(很重要)

✅ 结构化(JSON)
✅ 包含:

  • time
  • level
  • service
  • trace_id
  • msg

示例:

{
  "time": "2026-01-21T10:00:00Z",
  "level": "error",
  "service": "order",
  "trace_id": "abc123",
  "msg": "db timeout"
}

如果你愿意,可以:

  • 发一段真实 Golang 日志
  • 或说明是容器 / systemd / 裸机
  • 或说你在分析哪类问题(慢、崩、OOM)

我可以直接帮你做具体日志分析。

0 踩