Golang os.Create 权限被拒绝

Golang os.Create permission denied

我正在尝试在 linux /var/log 目录中创建日志文件,但权限被拒绝。有没有无需更改目录所有权的最佳做法?

f, _ := os.Create("/var/log/go_server.log")
defer f.Close()
log.SetOutput(f)

您遇到的是标准 UNIX 权限问题。鉴于该目录的特殊性,您有三个选择:

  1. 将该目录的权限更改为更加混杂。坏主意,因为它在安全方面打开了一堆讨厌的蠕虫。
  2. 运行 使用 sysV、upstart 或 systemd 的 go 程序使得该程序在具有权限的用户(通常是 root)下运行。更好,因为只有一个进程获得升级,并且您可以使用 upstart 或 systemd 获得很好的 start/stop/monitor 例程和基本的自我修复。事实上,如果您还没有使用其中之一,您可能想探索一下。
  3. 使用 go's built-in interface to syslog 并配置您的本地 syslogd 以将其日志保存到该文件。最好,因为您只是将日志发送到套接字并让服务为您处理它。

另请注意,如果您配置正确,systemd 可以将您的 stdout/err 保存到文件中,然后您可以使用 journalctl 浏览。事实上,让你的程序愚蠢地打印诊断到 stdout/err 而不是 fork 本身是最明智的做法,因为 systemd 为你做了所有这些事情(这样,你可以专注于你的程序所做的事情而不是重新发明wheel wrt 守护进程和日志记录)。

对于 systemd 的所有悲伤,它实际上非常擅长这个用例。