在 Linux 上用 Go 写程序时,“日志丢失”是一个比较常见但不一定单纯是 Go 的问题。下面按最常见原因 → 排查思路 → 解决建议来说明。
Go 的 log / fmt.Fprintf / 自己写的 buffer 都可能有缓冲:
| tee:全缓冲os.Exit / kill -9 → 缓冲未 flush → 日志丢失✅ 表现:
✅ 解决:
log.SetOutput 到 带 flush 的 WriterFlush()bufio.Writer 并显式 Flushzap / logrus(默认更安全)在 Linux 上常见场景:
systemd 服务nohup xxx > log 2>&1 &supervisor / docker问题:
✅ 排查:
journalctl -u your-service
✅ 建议:
StandardOutput=file:/var/log/app.log
StandardError=file:/var/log/app.log
典型:
logrotate 把文件重命名✅ 表现:
ls 看到文件,但 cat 没内容✅ 解决:
copytruncate
Go 多 goroutine 同时写:
✅ 解决:
sync.Mutexzap(原子写)fmt.Fprintf(file)✅ 表现:
✅ 排查:
ls -l /var/log/your.log
id
panic 没 recoverdefer 中日志没 flush✅ 建议:
defer logger.Sync()(zap)import "go.uber.org/zap"
logger, _ := zap.NewProduction()
defer logger.Sync()
logger.Info("start")
✅ 自动:
如果你愿意,可以贴:
我可以直接帮你定位是哪一类问题。