如果没有安装或激活日志守护进程,记录器生成的日志会怎样

如果没有安装或激活日志守护进程,记录器生成的日志会怎样

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

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

当没有日志服务时,生成的日志会怎样logger

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

答案1

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

在大多数 Linux 发行版中,此套接字不是不再由传统的 syslog 守护进程拥有——它的另一端实际上并不直接进入 rsyslog。相反,/dev/log 套接字由systemd 日志服务仍在运行并接收消息。

# fuser -v /dev/log
                                 USER        PID ACCESS COMMAND
/run/systemd/journal/dev-log:    root          1 F.... systemd
                                 root        304 F.... systemd-journal

(请注意,init 也持有套接字 - 如果 journald 停止,但套接字上有一些活动,init 将自动重新启动该服务......就像过去“inetd”对 TCP 服务所做的那样。)

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

在这样的系统中,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

相关内容