在 Debian 上部署 Go 程序时,“日志权限”通常涉及 日志文件本身的 Linux 文件权限、运行用户、以及 日志轮转(logrotate)。下面按常见场景说明。
例如用户:appuser
sudo useradd -r -s /usr/sbin/nologin appuser
日志目录:
sudo mkdir -p /var/log/myapp
sudo chown appuser:appuser /var/log/myapp
sudo chmod 750 /var/log/myapp
日志文件:
sudo touch /var/log/myapp/app.log
sudo chown appuser:appuser /var/log/myapp/app.log
sudo chmod 640 /var/log/myapp/app.log
Go 程序运行:
sudo -u appuser /opt/myapp/myapp
✅ 推荐权限:
750640/etc/systemd/system/myapp.service
[Unit]
Description=My Go App
[Service]
User=appuser
Group=appuser
WorkingDirectory=/opt/myapp
ExecStart=/opt/myapp/myapp
Restart=always
[Install]
WantedBy=multi-user.target
然后:
sudo systemctl daemon-reload
sudo systemctl enable myapp
sudo systemctl start myapp
systemd 会自动以 appuser 身份写日志。
Go 程序:
log.SetOutput(os.Stdout)
systemd 配置:
StandardOutput=journal
StandardError=journal
查看日志:
journalctl -u myapp
✅ 不需要手动管日志权限
/etc/logrotate.d/myapp/var/log/myapp/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
create 640 appuser appuser
sharedscripts
postrotate
systemctl kill -s USR1 myapp.service
endscript
}
⚠️ 如果 Go 程序 不支持 USR1 信号重新打开日志,请改为:
copytruncatecopytruncate
chmod❌ 不推荐:
os.Chmod("app.log", 0777)
✅ 正确做法:
log/slog(Go 1.21+)zaplogrus示例(slog + 文件):
f, _ := os.OpenFile("/var/log/myapp/app.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0640)
logger := slog.New(slog.NewTextHandler(f, nil))
open /var/log/myapp/app.log: permission denied
✅ 检查:
ps aux | grep myapp
ls -l /var/log/myapp
✅ 手动测试:
logrotate -d /etc/logrotate.d/myapp
✅ 推荐方案:
750640如果你愿意,可以告诉我:
我可以给你一份 完全可直接用的配置。