在 Debian 上运行 Go 程序时,日志权限问题通常出现在以下几个场景。下面按常见原因 + 解决办法给你系统梳理一下。
例如:
logFile, err := os.OpenFile("/var/log/myapp/app.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
报错:
open /var/log/myapp/app.log: permission denied
原因
/var/log/myapp 属于 root解决
sudo mkdir -p /var/log/myapp
sudo chown -R youruser:youruser /var/log/myapp
或给目录写权限:
sudo chmod 755 /var/log/myapp
如果你用 systemd 管理服务:
[Service]
User=www-data
ExecStart=/opt/myapp/app
但日志目录是 root 的,就会没权限。
解决方式 A(推荐):专门建日志目录
sudo mkdir /var/log/myapp
sudo chown -R www-data:www-data /var/log/myapp
解决方式 B:使用 systemd 的日志
log.SetOutput(os.Stdout)
然后在 service 中:
StandardOutput=journal
StandardError=journal
查看日志:
journalctl -u myapp
ls -l /var/log/myapp/app.log
如果是:
-rw-r--r-- 1 root root
而程序是普通用户运行,就会失败。
解决
sudo chown youruser:youruser /var/log/myapp/app.log
有些程序:
syscall.Setuid(1000)
但日志文件已以 root 打开,或目录无权限。
建议
Debian 的 logrotate 可能重建日志文件:
/var/log/myapp/*.log {
rotate 7
daily
missingok
notifempty
create 0644 root root
}
导致程序无法写入。
解决
create 0644 youruser youruser
或:
su youruser youruser
logFile, err := os.OpenFile(
"/var/log/myapp/app.log",
os.O_APPEND|os.O_CREATE|os.O_WRONLY,
0644,
)
if err != nil {
log.Fatalf("cannot open log file: %v", err)
}
log.SetOutput(logFile)
logPath := os.Getenv("LOG_FILE")
if logPath == "" {
logPath = "app.log"
}
查看当前用户:
whoami
id
查看目录权限:
namei -l /var/log/myapp/app.log
临时测试:
sudo -u www-data /opt/myapp/app
✅ 不要写 /var/log 除非必要
✅ 优先使用 systemd journal
✅ 日志目录专门建,专用户拥有
✅ 不要用 root 跑 Go 服务
如果你能贴出:
我可以给你更精确的解决方案。