在 CentOS 上运行 Golang 程序时“日志丢失”是一个比较常见的问题,通常不是 Go 本身丢日志,而是运行环境、输出方式或日志框架配置导致的。下面按常见原因给你系统性梳理一下。
nohup / & 但没重定向nohup ./app &
如果你没有重定向输出:
nohup ./app > app.log 2>&1 &
那么日志可能:
✅ 正确方式:
nohup ./app >> /var/log/app.log 2>&1 &
如果你用:
systemctl start yourapp
Go 的 log.Println / fmt.Println 默认输出到 stdout/stderr,会被 journald 接走。
❌ 常见误区:
✅ 查看方式:
journalctl -u yourapp.service
journalctl -u yourapp.service -f
✅ 如果想写文件:
[Service]
StandardOutput=append:/var/log/app.log
StandardError=append:/var/log/app.err
例如:
bufio.Writer进程被 kill -9 或 panic 时:
✅ 解决:
log.SetOutput(os.Stdout)(无缓冲)Flush()zap / slog如果:
copytruncate结果:
✅ 正确 logrotate 配置:
/var/log/app.log {
daily
rotate 7
copytruncate
missingok
}
/var/log 非 root 不可写✅ 检查:
ls -Z /var/log/
getenforce
✅ 解决:
/opt/app/log例如:
这时:
✅ 建议:
defer recovery + Fatal* * * * * /opt/app
cron 的 stdout 默认发邮件,不写文件。
✅ 必须:
* * * * * /opt/app >> /var/log/app.log 2>&1
✅ 生产环境建议:
zap 或 slog如果你愿意,可以告诉我:
我可以直接帮你定位是哪一种。