温馨提示×

golang日志centos权限问题

小樊
51
2026-09-18 06:39:29
栏目: 编程语言

在 CentOS 上跑 Go 程序时,日志写不进去 / 没权限是很常见的问题,通常不是 Go 本身的 bug,而是Linux 权限、SELinux、systemd 环境导致的。下面按常见场景说明和解决。


一、最常见原因:日志目录没有写权限

现象

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

原因

  • 日志目录属于 root
  • Go 程序用普通用户运行
  • 目录权限是 755

解决方式

1. 修改目录权限(推荐)

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

2. 或用日志组

sudo chown -R root:logs /var/log/myapp
sudo chmod 775 /var/log/myapp
sudo usermod -aG logs myuser

二、systemd 服务运行导致的权限问题(非常常见)

现象

  • 手动运行 Go 程序正常
  • 用 systemctl start xxx 就写不了日志

原因

systemd 默认用 root 或其他用户,工作目录也不是你以为的目录。

正确示例

[Unit]
Description=My Go App

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

[Install]
WantedBy=multi-user.target

⚠️ 没写 User=,默认是 root,但日志目录可能不允许 root 写(少见但存在)


三、SELinux 导致(CentOS 特有,最容易被忽略)

判断是不是 SELinux 问题

sudo getenforce

如果是 Enforcing,继续看:

sudo tail -f /var/log/audit/audit.log | grep denied

解决方式

方案 1:给日志目录正确的 SELinux 类型

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

方案 2:临时关闭(不推荐生产)

sudo setenforce 0

四、Go 代码里日志路径写死导致问题

不推荐

logfile, _ := os.OpenFile("/var/log/app.log", ...)

推荐做法

  • 用配置指定日志路径
  • 或默认输出到 stdout(systemd 会接管)
log.SetOutput(os.Stdout)

然后在 systemd 里:

StandardOutput=journal
StandardError=journal

五、推荐生产最佳实践(CentOS + Go)

✅ 日志写 stdout
✅ systemd + journalctl 管理
✅ 必须写文件时:

  • /var/log/<app>/
  • 目录属主 = 运行用户
  • SELinux 正确标签

六、快速自检清单

whoami
ls -ld /var/log/myapp
ls -l /var/log/myapp
getenforce
ps -ef | grep myapp

如果你愿意,可以贴:

  • Go 日志代码
  • systemd service 文件
  • 报错完整信息

我可以直接帮你定位到具体哪一步出问题。

0 踩