温馨提示×

golang日志linux权限问题

小樊
50
2026-10-05 11:55:13
栏目: 编程语言

下面按常见场景梳理 Golang 在 Linux 下写日志时的权限问题及解决办法,都是实战中容易踩的坑。


一、最常见的权限问题场景

1️⃣ 日志目录没有写权限

现象

open /var/log/myapp/app.log: permission denied

原因

  • 程序以普通用户运行
  • 日志目录属于 root 或其他用户

解决

# 创建专用日志目录
sudo mkdir -p /var/log/myapp
sudo chown -R appuser:appuser /var/log/myapp

或运行时指定用户可写目录:

./myapp --log-dir ./logs

2️⃣ 用 root 启动,后来切普通用户(权限错乱)

现象

  • 第一次用 root 启动,日志文件是 root 创建的
  • 之后用普通用户运行,写不进去

解决

sudo chown appuser:appuser /var/log/myapp/app.log

或删除旧日志重新生成:

sudo rm /var/log/myapp/app.log

3️⃣ systemd 服务权限问题(非常常见)

现象

failed to open log file: open /var/log/myapp.log: permission denied

原因

  • systemd 默认以 root 或指定用户运行
  • 目录权限不对

正确做法

/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

4️⃣ 日志轮转后权限变了(logrotate)

现象

  • 日志轮转后新日志写不进去

原因

  • logrotate 用 root 创建新文件

解决(推荐配置)

/var/log/myapp/*.log {
    daily
    rotate 7
    missingok
    notifempty
    compress
    copytruncate
    create 0644 appuser appuser
}

二、Golang 代码层建议(避免权限坑)

✅ 1. 不要硬编码 root 路径

logFile := os.Getenv("LOG_DIR")
if logFile == "" {
    logFile = "./logs/app.log"
}

✅ 2. 启动时检查目录权限

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)
}

✅ 3. 推荐使用日志库(自动处理权限)

  • logrus
  • zap
  • slog(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 硬路径


如果你能贴出:

  • 错误日志
  • 启动方式(直接跑 / systemd / docker)
  • 日志库(原生 log / zap / logrus)

我可以给你精确到配置的解决方案。

0 踩