我想编写一个将日志放在/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
就我而言)- 将该组添加到用户的补充组中