如果您的 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