在 Linux 上用 Go 写日志时经常遇到“权限错误”,通常不是 Go 本身的问题,而是Linux 权限模型 + 运行方式 + 路径选择导致的。下面按常见原因逐一说明。
例如:
logfile, err := os.OpenFile("/var/log/myapp.log", os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644)
如果程序是以普通用户运行:
./myapp
但 /var/log 只属于 root:
drwxr-xr-x root root /var/log
就会报错:
open /var/log/myapp.log: permission denied
✅ 解决:
sudo 运行os.UserHomeDir()
sudo mkdir /var/log/myapp
sudo chown $USER:$USER /var/log/myapp
比如:
sudo 启动过-rw-r--r-- root root /var/log/myapp.log
Go 打开时即使只是 O_APPEND|O_WRONLY 也会失败。
✅ 解决:
sudo chown $USER:$USER /var/log/myapp.log
有时你以为是权限错,其实是:
open ./logs/app.log: no such file or directory
Go 不会自动创建目录。
✅ 正确做法:
os.MkdirAll("logs", 0755)
如果你用 systemd:
[Service]
User=appuser
但日志路径是:
/var/log/myapp.log
即使你手动 chmod 777,systemd 仍可能拒绝(尤其搭配 ProtectSystem=full)。
✅ 解决:
LogsDirectory=myapp
/var/log/myapp/myapp.log
在 CentOS / RHEL:
ls -Z /var/log/myapp.log
如果 SELinux 类型不对,Go 会报:
permission denied
✅ 解决:
sudo semanage fcontext -a -t var_log_t "/var/log/myapp.log"
sudo restorecon -v /var/log/myapp.log
容器内:
/var/log/myapp.log
宿主机挂载:
-v /data/logs:/var/log
如果宿主机目录属主是 root,容器用户是 1000,就会失败。
✅ 解决:
chown -R 1000:1000 /data/logs
os.OpenFile("a.log", os.O_CREATE, 0444) // 只读,后面写不了
例如 logrus / zap:
logger := zap.New(zapcore.NewCore(...))
但底层 Writer 没权限。
whoami
ls -l 日志文件
ls -ld 日志目录
permission denied → 权限no such file → 路径read-only file system → 系统保护如果你愿意,可以把:
发出来,我可以帮你精准定位是哪一类权限问题。