在 CentOS 上跑 Go 程序时,日志写不进去 / 没权限是很常见的问题,通常不是 Go 本身的 bug,而是Linux 权限、SELinux、systemd 环境导致的。下面按常见场景说明和解决。
open /var/log/myapp/app.log: permission denied
root755sudo mkdir -p /var/log/myapp
sudo chown -R myuser:myuser /var/log/myapp
sudo chown -R root:logs /var/log/myapp
sudo chmod 775 /var/log/myapp
sudo usermod -aG logs myuser
systemctl start xxx 就写不了日志systemd 默认用 root 或其他用户,工作目录也不是你以为的目录。
[Unit]
Description=My Go App
[Service]
User=myuser
Group=myuser
WorkingDirectory=/opt/myapp
ExecStart=/opt/myapp/myapp
Restart=always
[Install]
WantedBy=multi-user.target
⚠️ 没写
User=,默认是 root,但日志目录可能不允许 root 写(少见但存在)
sudo getenforce
如果是 Enforcing,继续看:
sudo tail -f /var/log/audit/audit.log | grep denied
sudo semanage fcontext -a -t var_log_t "/var/log/myapp(/.*)?"
sudo restorecon -Rv /var/log/myapp
sudo setenforce 0
logfile, _ := os.OpenFile("/var/log/app.log", ...)
stdout(systemd 会接管)log.SetOutput(os.Stdout)
然后在 systemd 里:
StandardOutput=journal
StandardError=journal
✅ 日志写 stdout
✅ systemd + journalctl 管理
✅ 必须写文件时:
/var/log/<app>/whoami
ls -ld /var/log/myapp
ls -l /var/log/myapp
getenforce
ps -ef | grep myapp
如果你愿意,可以贴:
我可以直接帮你定位到具体哪一步出问题。