在 CentOS 上运行 Golang 程序时“日志缺失”,通常不是 Golang 本身的问题,而是运行环境、系统配置或日志写入方式导致的。下面从常见原因到排查方法系统说明。
很多人用 log.Println 或 fmt.Println,以为会写文件,其实:
stdout / stderr 被 journald 接管journalctl,不在你期望的文件里✅ 查看方式:
journalctl -u your-service.service -f
常见于:
log.SetOutput(os.OpenFile("/var/log/myapp.log", ...))
可能问题:
/var/log/myapp/ 目录不存在nobody、www)无写权限✅ 检查:
ls -ld /var/log/myapp
id your-user
例如:
nohup ./app &
如果:
✅ 正确方式:
nohup ./app >> /var/log/myapp.log 2>&1 &
Golang:
log 包是即时写入✅ 确保:
defer f.Close()
或使用:
log.SetOutputzap / logrus(自动 flush)CentOS 默认开启 SELinux,可能:
/var/log✅ 快速验证:
setenforce 0
再观察日志是否出现。
✅ 永久解决(示例):
semanage fcontext -a -t var_log_t "/data/logs(/.*)?"
restorecon -Rv /data/logs
例如:
Error,但你认为应该有 Info✅ 检查:
log.SetLevel(log.InfoLevel)
✅ 推荐:
log.SetOutput(os.Stdout)
log.SetOutput(os.Stdout)
然后:
统一管理
f, _ := os.OpenFile("/var/log/myapp/app.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
log.SetOutput(f)
# 1. 是否真的在运行
ps aux | grep yourapp
# 2. 日志到底在哪
journalctl -u yourapp -f
# 3. 文件权限
ls -l /var/log/yourapp
# 4. SELinux
getenforce
# 5. 输出是否被重定向
cat /proc/<pid>/fd/1
你可以贴出:
我可以精准定位是哪一条原因。