在 Linux 上用 Go 写程序时“日志丢失”是一个常见但原因多样的问题。下面按最常见 → 较少见的顺序系统说明原因和解决办法。
Go 的 log / fmt 默认是行缓冲或全缓冲:
os.Exit()、panic、被 kill -9✅ 解决:
Flush 的日志库(zap / logrus)os.Exit,用 return + deferdefer logger.Sync() // zap
例如:
./app > app.log &
✅ 解决:
nohup ./app > app.log 2>&1 &如果使用 systemd:
[Service]
StandardOutput=journal
日志在 journald 中,不在文件里
✅ 解决:
journalctl -u your-serviceStandardOutput=file:/var/log/app.log
mv 走✅ 解决:
copytruncate✅ 解决:
sync.MutexInfo 被忽略Debug 没开✅ 检查:
logger.SetLevel(logrus.InfoLevel)
✅ 检查:
df -h
ls -l /var/log
✅ 解决:
# 是否真的写了
strace -e write -p <pid>
# 看 systemd 日志
journalctl -u your-app -f
# 看文件 fd
ls -l /proc/<pid>/fd
✅ 使用:
writer := zapcore.AddSync(&lumberjack.Logger{
Filename: "/var/log/app.log",
MaxSize: 100,
MaxBackups: 5,
Compress: true,
})
如果你能补充:
我可以给你更精确的定位和代码级建议。