如果没有安装或活动的日志守护程序,记录器生成的日志会发生什么

Dom*_*Dom 5 linux rsyslog

如果您的 Linux 发行版没有安装日志守护程序,或者禁用了日志守护程序,那么logger命令生成的日志会发生什么情况?

我有带有 rsyslog 服务的 Ubuntu 20.04.2。当我关闭此服务时,我仍然可以使用该logger命令,没有任何内容写入系统日志,但该命令仍然接受我的输入并且退出代码为零。

当没有日志服务时,由 生成的日志会发生什么logger

logger如果没有地方发送日志,命令如何工作?为什么没有logger收到日志会成功退出?

use*_*686 6

'logger' 将数据发送到 Unix 套接字/dev/log。(尽管在 /dev 中,但它是一个套接字。)

在大多数 Linux 发行版上,这个套接字不再属于传统的 syslog 守护进程——它的另一端实际上并不直接进入 rsyslog。相反,/dev/log 套接字归systemd-journald服务所有,该服务仍在运行并接收消息。

# fuser -v /dev/log
                                 USER        PID ACCESS COMMAND
/run/systemd/journal/dev-log:    root          1 F.... systemd
                                 root        304 F.... systemd-journal
Run Code Online (Sandbox Code Playgroud)

(请注意,init 也持有套接字——如果 journald 停止了,但套接字上有一些活动,init 将自动再次启动服务……就像过去为 TCP 服务所做的 'inetd' 一样。)

Systemd-journald 将日志存储在 /var/log/journal 中,您可以使用它journalctl -f而不是通常的“tail -f”(它们是索引的二进制格式)来读取日志。通常,即使 rsyslogd 关闭,通过 /dev/log 的消息也会继续写入那里。

$ logger Hello

$ journalctl -n 1
Jul 12 18:12:26 ember root[951422]: Hello
Run Code Online (Sandbox Code Playgroud)

在这样的系统中,rsyslogd 和 syslog-ng 包只接收来自 systemd-journald 的中继消息,而不是直接从程序接收。它们通过侦听不同的套接字(在 /run/systemd 内部)来工作,journald 将所有消息转发到该套接字,或者直接从 /var/log/journal 读取二进制日志文件。

(通常直接 .journal 文件访问是首选,因为它允许 rsyslogd 收集程序包含的其他字段,否则在使用基于套接字的消息转发时会丢失这些字段。)

如果您将 'logger' 指向不接受消息的 Unix 套接字,它实际上会显示一条错误消息,如下所示:

$ python -c "from socket import *; socket(AF_UNIX, SOCK_DGRAM).bind('/tmp/log')"

$ logger -u /tmp/log Hello
logger: socket /tmp/log: Connection refused
Run Code Online (Sandbox Code Playgroud)