下面按常见场景梳理 Golang 在 Linux 下写日志时的权限问题及解决办法,都是实战中容易踩的坑。
现象
open /var/log/myapp/app.log: permission denied
原因
解决
# 创建专用日志目录
sudo mkdir -p /var/log/myapp
sudo chown -R appuser:appuser /var/log/myapp
或运行时指定用户可写目录:
./myapp --log-dir ./logs
现象
解决
sudo chown appuser:appuser /var/log/myapp/app.log
或删除旧日志重新生成:
sudo rm /var/log/myapp/app.log
现象
failed to open log file: open /var/log/myapp.log: permission denied
原因
正确做法
/etc/systemd/system/myapp.service
[Service]
User=appuser
Group=appuser
WorkingDirectory=/opt/myapp
ExecStart=/opt/myapp/myapp
然后:
sudo systemctl daemon-reload
sudo systemctl restart myapp
现象
原因
解决(推荐配置)
/var/log/myapp/*.log {
daily
rotate 7
missingok
notifempty
compress
copytruncate
create 0644 appuser appuser
}
logFile := os.Getenv("LOG_DIR")
if logFile == "" {
logFile = "./logs/app.log"
}
if err := os.MkdirAll(dir, 0755); err != nil {
log.Fatal(err)
}
f, err := os.OpenFile(path, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
if err != nil {
log.Fatal("cannot open log file:", err)
}
logruszapslog(Go 1.21+)logger := slog.New(slog.NewTextHandler(os.Stdout, nil))
# 查看文件权限
ls -l /var/log/myapp
# 查看进程用户
ps -ef | grep myapp
# 检查能否写入
sudo -u appuser touch /var/log/myapp/test.log
✅ 日志目录专用
✅ 程序和日志同用户
✅ systemd 显式指定 User
✅ logrotate 指定 create 用户
✅ 不要在代码里写 /root 或 /var/log 硬路径
如果你能贴出:
我可以给你精确到配置的解决方案。