hpi*_*rlo 1 linux syslog systemd systemd-journald
我正在开发一个使用syslog(). 然后我配置rsyslog服务将日志保存在Linux. 大多数时候这个过程正常进行。但有时,某些日志不会发送到rsyslog. 相反,我可以在使用journalctl -f -u Myservice命令时观看它们。我正在使用Debian Jessie的版本Linux。您知道问题是什么以及如何解决吗?
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是用于从/dev/log捕获消息的 systemd 套接字单元:
[...]
[Socket]
Service=systemd-journald.service
ListenDatagram=/run/systemd/journal/dev-log
Symlinks=/dev/log
SocketMode=0666
[...]
Run Code Online (Sandbox Code Playgroud)
在上面的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
Run Code Online (Sandbox Code Playgroud)
因此,任何进程调用syslog()实际上都会写入/dev/log ,与/run/systemd/journal/dev-log同义。当 systemd-journald 从此套接字读取时,这使其捕获写入/dev/log的所有进程的日志。但 systemd 实现了一种将这些日志转发到任何“注册”服务的机制。
有一个syslog.socket单元设置/run/systemd/journal/syslog套接字:
[...]
[Socket]
ListenDatagram=/run/systemd/journal/syslog
[...]
Run Code Online (Sandbox Code Playgroud)
之后会触发对应的syslog.service。后者实际上是实际 syslog 服务的符号链接(例如rsyslogd或syslog-ng)。这是一个示例,其中它是rsyslog.service的符号链接:
[...]
[Socket]
ListenDatagram=/run/systemd/journal/syslog
[...]
Run Code Online (Sandbox Code Playgroud)
后者服务的内容,执行rsyslogd守护进程:
$ 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
Run Code Online (Sandbox Code Playgroud)
我们可以通过查看syslog服务的状态(字段“TriggeredBy”)来验证其激活:
[...]
[Service]
Type=notify
ExecStart=/usr/sbin/rsyslogd -n -iNONE
[...]
Run Code Online (Sandbox Code Playgroud)
上面的启动消息显示rsyslogd已传递 unix 套接字/run/systemd/journal/syslog(文件描述符 id 3)。这是由 的imuxsock模块管理的rsyslogd。这确实是进程打开的文件描述符的一部分rsyslogd:
$ 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]
Run Code Online (Sandbox Code Playgroud)
配置决定从/run/systemd/journal/dev-log读取systemd-journald的内容是否转发到/run/systemd/journal/syslog:
$ cat /etc/systemd/journald.conf | grep ForwardToSyslog
#ForwardToSyslog=yes
Run Code Online (Sandbox Code Playgroud)
上面的注释行表示默认为“yes”。
如果进程发送的某些日志未在rsyslogd的输出中看到,但在systemd-journald的输出中看到,这可能意味着rsyslogd与应用程序相比启动得不够早。因此,后者的日志记录会被读取,systemd-journald但不会转发到rsyslogd. 后者在 的systemdmulti-user.target中启动,而 systemd-journald 在系统启动之初启动。
为了验证这一点,结果systemctl status syslog.service显示激活日期。将其与systemd-journald.service的激活日期和应用程序的激活日期进行比较。
应用程序的服务文件中可能缺少诸如“After=syslog.service”之类的同步密钥。
https://www.freedesktop.org/wiki/Software/systemd/syslog/
| 归档时间: |
|
| 查看次数: |
795 次 |
| 最近记录: |