温馨提示×

linux golang日志怎样定位

小樊
47
2026-10-02 14:10:59
栏目: 编程语言

在 Linux 上用 Golang 写服务时,“日志怎样定位问题”一般从 日志内容设计、日志采集、检索分析、结合系统工具 几方面来做。下面按实战角度讲。


一、Golang 日志要“可定位”

1. 日志必须包含的关键信息

一条能定位问题的日志至少要有:

  • 时间(带时区)
  • 日志级别(INFO / WARN / ERROR)
  • 位置信息(文件:行号 / 函数)
  • 请求上下文(TraceID / RequestID)
  • 关键业务参数
  • 错误信息 + 堆栈

示例(推荐):

2026-01-15T10:20:31+08:00 ERROR rpc/user.go:88 trace_id=abc123 user_id=1001 msg="call user service timeout" err="context deadline exceeded"

二、Golang 常用日志方案

1. 标准库(不推荐单独用)

log.Println("error:", err)

❌ 缺级别、缺上下文、难检索


2. 推荐日志库

✅ zap(最常用,性能最好)

logger, _ := zap.NewProduction()
logger.Error("call user service failed",
    zap.String("trace_id", traceID),
    zap.Int("user_id", userID),
    zap.Error(err),
)

✅ logrus(易用)

log.WithFields(log.Fields{
    "trace_id": traceID,
    "user_id": userID,
}).Error(err)

✅ slog(Go 1.21+ 官方)

logger.Error("call failed",
    "trace_id", traceID,
    "user_id", userID,
    "err", err,
)

三、Linux 上如何“定位”日志

1. 查看实时日志

tail -f /var/log/app/app.log

2. 按关键字定位

grep "trace_id=abc123" app.log

3. 按时间范围

sed -n '/2026-01-15 10:00/,/2026-01-15 11:00/p' app.log

4. 按错误级别

grep -E "ERROR|PANIC" app.log

四、结合 systemd(非常常见)

如果是 systemd 服务:

journalctl -u your-service -f
journalctl -u your-service --since "2026-01-15 10:00"

配合 Go 日志:

# /etc/systemd/system/app.service
StandardOutput=journal
StandardError=journal

五、分布式 / 高并发定位(重点)

1. 必须有 TraceID

  • HTTP:从 header 透传
  • RPC:context 透传
  • 日志里全程打印
ctx = context.WithValue(ctx, "trace_id", traceID)

2. 日志结构化(JSON)

{
  "time": "2026-01-15T10:20:31+08:00",
  "level": "ERROR",
  "trace_id": "abc123",
  "msg": "db timeout"
}

方便 ELK / Loki 检索。


六、日志收集架构(生产建议)

Go App
  ↓
文件 / stdout
  ↓
filebeat / vector
  ↓
Kafka
  ↓
ES / Loki
  ↓
Kibana / Grafana

常用组合:

  • Loki + Grafana(轻量推荐)
  • ELK(功能强)

七、常见定位思路总结

问题类型 定位方式
接口慢 trace_id + 耗时日志
panic 堆栈 + 行号
偶发错误 时间 + 请求参数
并发问题 goroutine id + trace
系统级 dmesg / top / strace

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

  • 你是 单机还是微服务
  • 用 zap / logrus / slog
  • 日志是 文件还是 stdout

我可以直接给你一套可复制的日志模板和定位方案。

0 踩