温馨提示×

centos golang日志权限怎设

小樊
33
2026-09-21 09:43:47
栏目: 编程语言

在 CentOS 上部署 Golang 程序时,“日志权限”通常涉及 日志文件本身的权限、运行用户、systemd 服务配置、以及日志轮转(logrotate) 几个方面。下面系统地说一下。


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

  1. Golang 程序没有权限写日志文件
    • 日志目录/文件属主不对
    • 程序以普通用户运行但日志目录是 root 的
  2. 日志越写越大,权限混乱
    • logrotate 切完后权限变了
  3. systemd 服务运行用户不对
    • 默认 root 能写,换成普通用户就失败

二、推荐的标准做法(CentOS + systemd)

1️⃣ 创建专门用户(可选但推荐)

useradd -r -s /sbin/nologin appuser

2️⃣ 创建日志目录并设权限

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

Golang 中日志路径示例:

log.SetOutput("/var/log/myapp/app.log")

3️⃣ systemd 服务配置(关键)

/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=on-failure

[Install]
WantedBy=multi-user.target

重载并启动:

systemctl daemon-reload
systemctl start myapp

✅ 这样日志权限就由 appuser 控制,安全且清晰。


三、日志轮转(logrotate)权限处理

示例 /etc/logrotate.d/myapp

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

说明:

  • create:新日志文件用指定权限和属主
  • copytruncate:适合不能重启的 Go 程序
  • 不推荐 kill -HUP(Go 默认不处理)

测试:

logrotate -d /etc/logrotate.d/myapp

四、如果你用第三方日志库

zap / logrus

确保 目录可写,而不是只关心文件:

os.MkdirAll("/var/log/myapp", 0750)

或者直接用 syslog

import "log/syslog"
logwriter, _ := syslog.New(syslog.LOG_INFO, "myapp")
log.SetOutput(logwriter)

五、SELinux 场景(CentOS 常见坑)

如果日志目录不是默认路径,可能写不进去:

ls -Z /var/log/myapp

修复:

semanage fcontext -a -t var_log_t "/var/log/myapp(/.*)?"
restorecon -Rv /var/log/myapp

或临时验证:

setenforce 0

六、快速排查清单

✅ 程序运行用户是谁
✅ 日志目录属主是否一致
✅ 目录是否有写权限
✅ systemd 是否指定 User
✅ logrotate 是否改了权限
✅ SELinux 是否拦截


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

  • 日志写在哪(路径)
  • 是否用 systemd
  • 用的日志库(标准库 / zap / logrus)

我可以给你一套直接可用的配置模板

0