在 CentOS 上运行 Golang 程序,日志“丢失”通常不是 Go 本身的问题,而是运行环境、日志写入方式或系统配置导致的。下面按常见原因 → 排查方法 → 解决方案说明。
如果你用 systemd 启动 Go 程序,而代码里只是:
log.Println("xxx")
fmt.Println("xxx")
这些日志会进入 journald,而不是文件。
journalctl -u your-service 能看到✅ 明确写文件:
log.SetOutput(os.OpenFile("/var/log/app.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644))
或
journalctl -u your-service -f
nohup ./app & 启动,但终端关闭nohup ./app &
如果没重定向:
nohup ./app > /var/log/app.log 2>&1 &
日志可能:
CentOS 默认:
/var/log 需要 rootos.OpenFile("/var/log/app.log", ...)
非 root 用户运行 → 失败但被忽略
ls -ld /var/log
id
getenforce
/var/lib/app/log/
sudo chown -R appuser /var/log/app
w := bufio.NewWriter(f)
w.WriteString("log")
// 没 w.Flush()
进程崩了 → 缓冲丢失
✅ 用:
log.SetOutput(w)
defer w.Flush()
kill -9dmesg | grep -i oom
journalctl -u your-service
CentOS 默认:
/var/log/* 会 rotateapp.log-20260101你可能只看了 app.log
✅ 检查:
ls -lh /var/log/app*
getenforce
如果是 Enforcing:
ausearch -m avc -ts recent
✅ 解决:
setenforce 0 # 临时
# 或加策略
✅ 挂载卷:
-v /data/log:/app/log
✅ 最佳实践
logFile, _ := os.OpenFile("/var/lib/app/app.log", os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644)
log.SetOutput(logFile)
✅ 或用库:
zaplogrus✅ systemd 示例:
[Service]
ExecStart=/usr/local/bin/app
StandardOutput=append:/var/log/app.log
StandardError=append:/var/log/app.log
如果你愿意,可以贴:
我可以精准定位是哪一条原因。