如果您的 Linux 发行版没有安装日志守护程序,或者禁用了日志守护程序,那么logger
命令生成的日志会发生什么情况?
我有带有 rsyslog 服务的 Ubuntu 20.04.2。当我关闭此服务时,我仍然可以使用该logger
命令,没有任何内容写入系统日志,但该命令仍然接受我的输入并且退出代码为零。
当没有日志服务时,由 生成的日志会发生什么logger
?
logger
如果没有地方发送日志,命令如何工作?为什么没有logger
收到日志会成功退出?
'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)