笼统地说,使用 systemd,日志管理如下:
Process calls syslog()--写入-->/dev/log = /run/systemd/journal/dev-log--阅读者-->systemd-journald--转发到-->/run/systemd/journal/syslog--阅读者-->rsyslogd
让我们更详细地看看它......
/lib/systemd/system/systemd-journald-dev-log.socket是从中捕获消息的 systemd 套接字单元/dev/log:
[...]
[Socket]
Service=systemd-journald.service
ListenDatagram=/run/systemd/journal/dev-log
Symlinks=/dev/log
SocketMode=0666
[...]
在上面的socket单元中,有两个重要的东西:
$ ls -l /dev/log
lrwxrwxrwx 1 root root 28 sept. 14 09:47 /dev/log -> /run/systemd/journal/dev-log
$ ls -l /run/systemd/journal/dev-log
srw-rw-rw- 1 root root 0 sept. 14 09:47 /run/systemd/journal/dev-log
因此任何调用syslog()的进程实际上写入/dev/log的同义词/run/systemd/journal/dev-log.当 systemd-journald 从这个套接字读取时,这使得它捕获所有写入进程的日志/dev/log.但是 systemd 实现了一种将这些日志转发到任何“已注册”服务的机制。
有一个系统日志.socket设置的单位/run/systemd/journal/syslog插座:
[...]
[Socket]
ListenDatagram=/run/systemd/journal/syslog
[...]
相应的系统日志服务之后被触发。后者实际上是指向实际系统日志服务的符号链接(例如 rsyslogd 或 syslog-ng)。这是一个例子,它是一个符号链接到rsyslog.service:
$ ls -l /etc/systemd/system/syslog.service
lrwxrwxrwx 1 root root 35 juin 5 2021 /etc/systemd/system/syslog.service -> /lib/systemd/system/rsyslog.service
后面的服务内容,执行rsyslogd守护进程:
[...]
[Service]
Type=notify
ExecStart=/usr/sbin/rsyslogd -n -iNONE
[...]
我们可以通过查看系统日志服务(字段“TriggeredBy”):
$ systemctl status syslog | cat
* rsyslog.service - System Logging Service
Loaded: loaded (/lib/systemd/system/rsyslog.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2022-09-14 09:47:22 CEST; 32min ago
TriggeredBy: * syslog.socket
Docs: man:rsyslogd(8)
https://www.rsyslog.com/doc/
Main PID: 728 (rsyslogd)
Tasks: 4 (limit: 18404)
Memory: 3.9M
CGroup: /system.slice/rsyslog.service
`-728 /usr/sbin/rsyslogd -n -iNONE
sept. 14 09:47:22 xxx systemd[1]: Starting System Logging Service...
sept. 14 09:47:22 xxx rsyslogd[728]: imuxsock: Acquired UNIX socket '/run/systemd/journal/syslog' (fd 3) from systemd. [v8.2001.0]
上面的启动消息显示 rsyslogd 已通过 unix 套接字/run/systemd/journal/syslog(文件描述符 id 3)。这是由rsyslogd的imuxsock模块管理的。这确实是rsyslogd进程打开的文件描述符的一部分:
$ sudo ls -l /proc/`pidof rsyslogd`/fd
total 0
lr-x------ 1 root root 64 sept. 14 09:47 0 -> /dev/null
l-wx------ 1 root root 64 sept. 14 09:47 1 -> /dev/null
l-wx------ 1 root root 64 sept. 14 09:47 10 -> /var/log/kern.log
l-wx------ 1 root root 64 sept. 14 09:47 11 -> /var/log/mail.log
l-wx------ 1 root root 64 sept. 14 09:47 2 -> /dev/null
lrwx------ 1 root root 64 sept. 14 09:47 3 -> 'socket:[1339]'
lr-x------ 1 root root 64 sept. 14 09:47 4 -> /dev/urandom
lrwx------ 1 root root 64 sept. 14 09:47 5 -> 'socket:[36221]'
lr-x------ 1 root root 64 sept. 14 09:47 6 -> /proc/kmsg
lrwx------ 1 root root 64 sept. 14 09:47 7 -> 'socket:[36999]'
l-wx------ 1 root root 64 sept. 14 09:47 8 -> /var/log/syslog
l-wx------ 1 root root 64 sept. 14 09:47 9 -> /var/log/auth.log
systemd-journald 的 configuration 决定是否从中读取内容/run/systemd/journal/dev-log转发或不转发/run/systemd/journal/syslog:
$ cat /etc/systemd/journald.conf | grep ForwardToSyslog
#ForwardToSyslog=yes
上面的注释行表示默认是“是的”.
回答OP的问题
如果进程发送的某些日志在rsyslogd 的输出中没有看到,但在systemd-journald 的输出中看到,这可能意味着与应用程序相比,rsyslogd 启动得不够早。因此,后者的日志记录由 systemd-journald 读取,但不会转发给 rsyslogd。后者从 systemd 开始多用户.target而 systemd-journald 是在系统启动的一开始就启动的。
为了验证这一点,systemctl status syslog.service 的结果显示了激活日期。将其与激活日期进行比较systemd-journald.service和应用程序之一。
应用程序的服务文件中可能缺少同步密钥,如“After=syslog.service”。
进一步参考
https://www.freedesktop.org/wiki/Software/systemd/syslog/