在 CentOS 上部署 Golang 程序时,“日志权限”通常涉及 日志文件本身的权限、运行用户、systemd 服务配置、以及日志轮转(logrotate) 几个方面。下面系统地说一下。
useradd -r -s /sbin/nologin appuser
mkdir -p /var/log/myapp
chown appuser:appuser /var/log/myapp
chmod 750 /var/log/myapp
Golang 中日志路径示例:
log.SetOutput("/var/log/myapp/app.log")
/etc/systemd/system/myapp.service
[Unit]
Description=My Go App
After=network.target
[Service]
User=appuser
Group=appuser
WorkingDirectory=/opt/myapp
ExecStart=/opt/myapp/myapp
Restart=on-failure
[Install]
WantedBy=multi-user.target
重载并启动:
systemctl daemon-reload
systemctl start myapp
✅ 这样日志权限就由 appuser 控制,安全且清晰。
/etc/logrotate.d/myapp/var/log/myapp/*.log {
daily
rotate 7
missingok
notifempty
compress
copytruncate
create 0640 appuser appuser
}
说明:
create:新日志文件用指定权限和属主copytruncate:适合不能重启的 Go 程序kill -HUP(Go 默认不处理)测试:
logrotate -d /etc/logrotate.d/myapp
确保 目录可写,而不是只关心文件:
os.MkdirAll("/var/log/myapp", 0750)
或者直接用 syslog:
import "log/syslog"
logwriter, _ := syslog.New(syslog.LOG_INFO, "myapp")
log.SetOutput(logwriter)
如果日志目录不是默认路径,可能写不进去:
ls -Z /var/log/myapp
修复:
semanage fcontext -a -t var_log_t "/var/log/myapp(/.*)?"
restorecon -Rv /var/log/myapp
或临时验证:
setenforce 0
✅ 程序运行用户是谁
✅ 日志目录属主是否一致
✅ 目录是否有写权限
✅ systemd 是否指定 User
✅ logrotate 是否改了权限
✅ SELinux 是否拦截
如果你愿意,可以告诉我:
我可以给你一套直接可用的配置模板。