在 CentOS 上 Golang 程序“日志不输出”通常不是因为系统本身屏蔽了日志,而是输出位置、缓冲、系统服务方式、权限等问题。下面按常见原因给你排查清单。
log.Println / fmt.Println,但看不到输出如果你是用:
systemctl start yourapp
那么:
fmt.Println / log 默认输出到 stdout / stderr✅ 正确查看方式:
journalctl -u yourapp.service
❌ 错误方式:
ps 看进程
tail -f 某个文件 (你没写文件当然没内容)
如果 stdout 不是终端(比如 pipe、systemd、nohup):
fmt / log 不会实时 flush✅ 建议:
log 包(默认有换行 flush)os.Stdout.Sync()很多人写的是:
log.SetOutput(file)
但:
✅ 排查:
lsof -p 进程ID
或打印:
log.Println(os.Getwd())
示例正确 service:
[Unit]
Description=go app
[Service]
ExecStart=/opt/app/app
WorkingDirectory=/opt/app
User=appuser
Restart=always
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
如果日志写到:
/var/log/myapp.log
但没权限或 SELinux 限制:
✅ 检查:
getenforce
ls -Z /var/log/myapp.log
✅ 临时验证:
setenforce 0
直接用标准日志 → systemd journal
log.Println("start")
journalctl -u yourapp -f
写文件 + log rotate
log.SetOutput(&lumberjack.Logger{
Filename: "/var/log/myapp/app.log",
MaxSize: 100,
MaxBackups: 5,
})
用 zap / logrus
请你确认:
fmt 还是 log?journalctl 查看?如果你愿意,可以把:
贴出来,我可以直接帮你定位“为什么没输出”。