在 Debian 上跑 Go 程序时,“日志权限怎么设”通常分几种场景,我按最常见的情况给你说明。
先看你的 Go 程序是用什么用户跑的:
ps aux | grep your_app
常见情况:
www-data、appuser)推荐把日志放到统一目录,比如 /var/log/myapp:
sudo mkdir -p /var/log/myapp
sudo chown -R 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
含义:
750:属主可读写执行,组用户可读,其他人无权限640:属主读写,组只读logFile, err := os.OpenFile(
"/var/log/myapp/app.log",
os.O_CREATE|os.O_WRONLY|os.O_APPEND,
0644,
)
if err != nil {
log.Fatal(err)
}
log.SetOutput(logFile)
⚠️ 注意:
0644 是创建文件时的权限umask 影响(Debian 默认 022)如果你用 systemd 管理 Go 程序:
/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=always
[Install]
WantedBy=multi-user.target
sudo chown -R appuser:appuser /var/log/myapp
systemd 不会自动改日志权限,必须手动设。
如果你不想自己管日志文件:
log.SetOutput(os.Stdout)
然后:
journalctl -u myapp -f
优点:
Debian 用 logrotate:
/etc/logrotate.d/myapp
/var/log/myapp/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
create 640 appuser appuser
sharedscripts
postrotate
systemctl kill -s HUP myapp.service
endscript
}
如果是用 log 标准库,一般要 HUP 或重启。
❌ 权限不够:
open /var/log/myapp/app.log: permission denied
→ 用户不对 / 目录权限不对
❌ root 启动但日志属主是 root
→ 其他用户无法读
❌ umask 导致日志变成 644
→ 安全上不推荐
✅ 生产环境:
750640如果你愿意,可以告诉我:
我可以给你一份可直接用的配置。