温馨提示×

golang日志权限debian怎设置

小樊
45
2026-09-25 10:56:51
栏目: 编程语言

在 Debian 上用 Go 写程序时,“日志权限”通常包含 3 个层面:

  1. 日志文件本身权限(谁可读写)
  2. 程序运行用户权限(service 用哪个用户)
  3. Go 代码里创建日志文件时的权限(umask / os.OpenFile)

下面按常见场景说明。


一、日志文件权限(推荐做法)

1. 专用日志目录

sudo mkdir -p /var/log/myapp
sudo chown -R myuser:myuser /var/log/myapp
sudo chmod 750 /var/log/myapp

不要直接写到 /var/log 根目录,避免权限混乱


2. Go 中创建日志文件(关键)

Go 默认受 umask 影响,不能直接设 0644 以外的权限。

✅ 推荐写法:

f, 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(f)

如果你发现权限不对,检查 umask:

umask
# 0022 -> 文件默认 0644
# 0077 -> 文件默认 0600

二、Systemd 服务权限(最常见问题)

1. 创建 service

sudo vim /etc/systemd/system/myapp.service

示例:

[Unit]
Description=My Go App
After=network.target

[Service]
User=myuser
Group=myuser
WorkingDirectory=/opt/myapp
ExecStart=/opt/myapp/myapp
Restart=on-failure

[Install]
WantedBy=multi-user.target

2. 重载并启动

sudo systemctl daemon-reload
sudo systemctl enable myapp
sudo systemctl start myapp

✅ 这样日志文件就属于 myuser


三、日志轮转(logrotate)

Debian 推荐用 logrotate

sudo vim /etc/logrotate.d/myapp

内容:

/var/log/myapp/*.log {
    daily
    missingok
    rotate 14
    compress
    delaycompress
    notifempty
    create 0644 myuser myuser
    sharedscripts
    postrotate
        systemctl kill -s USR1 myapp.service
    endscript
}

如果 Go 用 signal.Notify 捕获 SIGUSR1 重新打开日志更好


四、常见错误 & 解决

❌ permission denied

原因:

  • service 是 root,但目录属于普通用户
  • 或反之

✅ 解决:

sudo chown -R myuser:myuser /var/log/myapp

❌ 日志文件 0600 其他人看不了

sudo chmod 0644 /var/log/myapp/app.log

或改 Go 创建权限为 0644


五、最佳实践总结

✅ 专用用户运行 Go 程序
✅ 专用日志目录
✅ Go 中用 0644 创建日志
✅ systemd 指定 User/Group
✅ 用 logrotate 管理


如果你愿意,可以告诉我:

  • 你是 直接运行 还是 systemd
  • 日志写到 哪
  • 是否用 第三方日志库(zap / logrus)

我可以给你更精确的配置。

0 踩