温馨提示×

debian golang日志权限怎设

小樊
44
2026-09-04 01:45:23
栏目: 编程语言

在 Debian 上跑 Go 程序时,“日志权限怎么设”通常分几种场景,我按最常见的情况给你说明。


一、日志文件权限(谁来写、谁来读)

1. 确定运行用户

先看你的 Go 程序是用什么用户跑的:

ps aux | grep your_app

常见情况:

  • systemd 服务 → 指定用户(如 www-dataappuser
  • 手动运行 → 当前登录用户

2. 创建日志目录并授权

推荐把日志放到统一目录,比如 /var/log/myapp

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

日志文件本身:

sudo touch /var/log/myapp/app.log
sudo chown appuser:appuser /var/log/myapp/app.log
sudo chmod 640 /var/log/myapp/app.log

含义:

  • 750:属主可读写执行,组用户可读,其他人无权限
  • 640:属主读写,组只读

二、Go 程序里怎么写日志

使用标准库

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

⚠️ 注意:

  • 0644创建文件时的权限
  • 实际权限还会受 umask 影响(Debian 默认 022

三、systemd 服务场景(推荐)

如果你用 systemd 管理 Go 程序:

1. 服务文件示例

/etc/systemd/system/myapp.service

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

[Service]
User=appuser
Group=appuser
WorkingDirectory=/opt/myapp
ExecStart=/opt/myapp/myapp
Restart=always

[Install]
WantedBy=multi-user.target

2. 日志目录权限

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

systemd 不会自动改日志权限,必须手动设。


四、用 journald(不写文件)

如果你不想自己管日志文件:

log.SetOutput(os.Stdout)

然后:

journalctl -u myapp -f

优点:

  • 不用管文件权限
  • 自动轮转
  • 安全审计更好

五、日志轮转(很重要)

Debian 用 logrotate

/etc/logrotate.d/myapp

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

如果是用 log 标准库,一般要 HUP 或重启。


六、常见坑

❌ 权限不够:

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

→ 用户不对 / 目录权限不对

❌ root 启动但日志属主是 root
→ 其他用户无法读

❌ umask 导致日志变成 644
→ 安全上不推荐


七、推荐做法总结

✅ 生产环境:

  • 专用用户运行
  • 日志目录 750
  • 日志文件 640
  • 用 logrotate
  • 或直接用 journald

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

  • 你是 systemd / docker / 手动运行
  • 日志是 文件 / stdout
  • Debian 版本

我可以给你一份可直接用的配置。

0