定位 Go 日志异常,通常可以按「先看清异常现象 → 再分层排查 → 用工具定位 → 复盘加固」的思路来做。下面给你一套比较实战的方法论。
Go 里常见的“日志异常”包括:
日志没打出来
日志内容不对
日志量异常
日志位置不对
运行时 panic / error 没被记录
检查几个点:
log(标准库)logrus / zap / sloglogger.SetLevel(logrus.DebugLevel)
if debug {
log.Println("debug info")
}
_ = doSomething() // ❌
✅ 建议:统一封装 logger,禁止裸 log.Println
常见问题:
示例(zap):
writer := zapcore.AddSync(&lumberjack.Logger{
Filename: "/var/log/app.log",
MaxSize: 100,
Compress: true,
})
检查:
kubectl logs pod-namejournalctl -u your-service典型坑:
示例:
go func() {
defer func() {
if r := recover(); r != nil {
log.Println("panic:", r)
}
}()
}()
fmt.Println 或 os.Stderr.Writeimport _ "net/http/pprof"
strace -f -e write go run main.go
dlv debug
| 现象 | 可能原因 |
|---|---|
| 本地有日志,线上没有 | 输出到 stdout 被丢弃 |
| 日志时间差 8 小时 | 时区未设置 |
| 日志突然停 | panic / OOM / 磁盘满 |
| 日志重复 | 初始化了两次 logger |
| 日志乱序 | 多 goroutine 未同步 |
slog 或 zaperrSync()如果你愿意,可以把:
发出来,我可以直接帮你定位到具体代码问题。