为什么大多数服务使用非 root 帐户可以在 /var/log 中创建日志文件?

为什么大多数服务使用非 root 帐户可以在 /var/log 中创建日志文件?

我想编写一个将日志放在/var/log中的服务,然后我在systemd下编辑一个xxx.service。

[Service]
User=xxx
Group=xxx

但是服务抛出一个错误,打开/var/log/xxx.log权限被拒绝。他们如何实现在/var/log中写入日志,并且日志所有者是服务帐户本身,如nginx,mysql,httpd等。它是在程序中实现的还是在操作系统中进行了一些配置?

答案1

如果您希望服务能够动态创建日志文件,则可以在创建服务时创建一个目录/var/log并将所有者设置为服务帐户

mkdir /var/log/myservice/
chown myservice:myservice /var/log/myservice/
chmod 755 /var/log/myservice/

例如,nginx 就是这种情况。第一次创建后,logrotate 可以处理文件所有权。在 centos8 中,/etc/logrotate.d/nginx如下所示:(参见第二行)

/var/log/nginx/*log {
    create 0664 nginx root
    daily
    rotate 10
    missingok
    notifempty
    compress
    sharedscripts
    postrotate
        /bin/kill -USR1 `cat /run/nginx.pid 2>/dev/null` 2>/dev/null || true
    endscript
}

当您查看日志文件时,您将看到只有实际的日志文件归 nginx 所有,而轮换的日志文件归 root 所有。

$ ls -l /var/log/nginx/
total 8
-rw-rw-r--. 1 nginx root    0 Aug 29  2020 access.log
-rw-r--r--. 1 root  root 3441 Aug 27  2020 access.log-20200829.gz
-rw-rw-r--. 1 nginx root    0 Aug 29  2020 error.log
-rw-r--r--. 1 root  root  658 Aug 27  2020 error.log-20200829.gz

如果您希望文件直接位于中/var/log,则必须再次以 root 身份创建它们并设置所有者。

答案2

有很多方法可以做到这一点,我将列举几种:

  • 创建一个子目录(/var/log/serviceXXX),该目录由相关用户/组拥有,并将日志文件放在那里
  • 与 syslog 守护进程对话,让该守护进程为您写入日志(这就是该守护进程的用途 - 这应该像打开/dev/log写入一样简单......)
  • 您甚至可以配置 syslog 守护进程以写入您想要的自定义日志文件,您所需要的就是创建一个自定义日志记录工具(fe 中的一个插入配置文件/etc/rsyslog.d
  • /var/log属于特定组(syslog就我而言)- 将该组添加到用户的补充组中

相关内容