在 CentOS 上运行 Go 程序日志“丢失”,通常不是 Go 本身的问题,而是 运行环境 / 日志写入方式 / 系统管理策略 导致的。下面按“最常见 → 较少见”的顺序给你系统性排查清单。
很多人在 CentOS 上这样跑:
nohup ./app &
或
./app > /dev/null 2>&1 &
➡ 日志根本没写文件,直接丢了
✅ 正确做法:
nohup ./app >> /var/log/app.log 2>&1 &
Go 默认:
fmt.Println("xxx")
log.Println("xxx")
这些 只写到 stdout/stderr,不会自动写文件。
如果你是通过:
systemctlsupervisorcron运行,日志可能在:
journalctl -u your-service
或
/var/log/messages
✅ 建议:Go 程序一定要显式写日志文件或用日志库
如果你用:
[Service]
ExecStart=/opt/app
但没有配置:
StandardOutput=file:/var/log/app.log
StandardError=file:/var/log/app.err
➡ 日志全进 journald
➡ 你直接 cat /var/log/app.log 是空的
✅ 解决:
journalctl -u your-service -f
或显式写文件。
log.SetOutput(os.Stdout)
如果你以为它写文件,其实没有。
✅ 正确:
log.SetOutput(&lumberjack.Logger{
Filename: "/var/log/app.log",
MaxSize: 10,
MaxBackups: 5,
})
Go 的 os.File.Write 是带缓冲的
如果你:
kill -9➡ 缓冲区日志直接丢失
✅ 建议:
log/slogzap / logrussync()df -h
df -i
➡ 日志写不进去,但不报错(或只报一次)
CentOS 默认开启 SELinux
ls -Z /var/log/app.log
如果权限不对:
setenforce 0 # 临时关闭测试
✅ 正式解决:
semanage fcontext -a -t var_log_t "/var/log/app.log"
restorecon -v /var/log/app.log
CentOS 常见:
/var/log/app.log {
missingok
notifempty
copytruncate
}
如果你:
➡ 日志写到“已经被 rename 的文件”
✅ 最佳方案:
lumberjackcopytruncate日志在:
docker logs xxx
kubectl logs pod
你写在:
/var/log/app.log
但容器一重启 → 文件没了
✅ 正确做法:
你可以逐条确认:
>> 或日志库df -h / df -ijournalctl -u 服务名import "gopkg.in/natefinch/lumberjack.v2"
log.SetOutput(&lumberjack.Logger{
Filename: "/var/log/app/app.log",
MaxSize: 50,
MaxBackups: 7,
Compress: true,
})
如果你愿意,可以把下面信息发我,我可以直接帮你定位:
我可以给你精确修复方案。