在 CentOS 上运行 Go 程序时“日志丢失”是一个比较常见的问题,通常不是 Go 本身丢日志,而是运行环境、重定向、systemd、buffer、权限等原因导致的。下面按常见原因逐一说明,并给出排查和解决办法。
log.Println / fmt.Printlnsystemctl 启动journalctl 里journalctl 看journalctl -u your-service -f
或 不要依赖 stdout,直接写日志文件:
log.SetOutput(os.OpenFile("/var/log/app.log", os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644))
killbufio.WriterFlush()log 被包装成异步writer.Flush()
或在程序退出前:
defer writer.Flush()
✅ 推荐:使用 zap / logrus(自带 flush 或同步写)
logrotatecopytruncatelogrotate + 专业日志库示例 logrotate:
/var/log/app.log {
daily
rotate 7
copytruncate
missingok
}
systemd 以非 root 运行/var/log 没权限mkdir /var/log/app
chown appuser:appuser /var/log/app
os.Exit()panic 没 recoverdefer func() {
if r := recover(); r != nil {
log.Println("panic:", r)
}
}()
./app > log.txt &
nohup ./app >> /var/log/app.log 2>&1 &
或用 systemd(推荐)
/var/log/audit/audit.log 有拒绝记录setenforce 0
或:
semanage fcontext -a -t var_log_t "/var/log/app(/.*)?"
restorecon -Rv /var/log/app
✅ 不要只用 fmt.Println
✅ 使用日志库(zap / logrus)
✅ 明确指定日志文件
✅ systemd 管理服务
✅ 配置 logrotate
✅ 程序退出前 flush
如果你愿意,可以告诉我:
我可以帮你精准定位是哪一类问题。