在 CentOS 上部署 Golang 程序时,日志文件的权限问题通常出现在以下几种场景:
下面按常见用法给你一套稳妥方案。
/var/log/你的项目sudo mkdir -p /var/log/myapp
sudo useradd -r -s /sbin/nologin myapp
sudo chown myapp:myapp /var/log/myapp
sudo chmod 750 /var/log/myapp
Golang 代码中:
logFile, _ := os.OpenFile(
"/var/log/myapp/app.log",
os.O_CREATE|os.O_WRONLY|os.O_APPEND,
0644,
)
[Unit]
Description=My Go App
After=network.target
[Service]
User=myapp
Group=myapp
WorkingDirectory=/opt/myapp
ExecStart=/opt/myapp/myapp
Restart=always
# 安全相关
NoNewPrivileges=true
ProtectSystem=full
ReadWritePaths=/var/log/myapp
[Install]
WantedBy=multi-user.target
⚠️ 注意
ProtectSystem=full 会禁止写 /var/logReadWritePaths=/var/log/myapp| 文件 | 权限 | 说明 |
|---|---|---|
| 日志目录 | 750 | 仅属主可写 |
| 日志文件 | 640 | 防其他用户读 |
| 程序二进制 | 755 | root 拥有 |
sudo chmod 640 /var/log/myapp/app.log
sudo vim /etc/logrotate.d/myapp
/var/log/myapp/*.log {
daily
rotate 7
missingok
notifempty
compress
copytruncate
create 0640 myapp myapp
}
create 保证新日志权限正确。
❌ root 写日志,普通用户跑程序 → 权限拒绝
❌ /home/user 下写日志 → systemd 可能禁止
❌ SELinux 拦截 → 看 /var/log/audit/audit.log
sudo setenforce 0
如果好了,说明是 SELinux:
sudo semanage fcontext -a -t var_log_t "/var/log/myapp(/.*)?"
sudo restorecon -Rv /var/log/myapp
chmod 777 /var/log/myapp
⚠️ 仅本地测试用,生产千万别。
如果你愿意,可以告诉我:
我可以直接给你完整可抄的配置。