The*_*eer 14 linux syslog systemd systemd-journald
/dev/log是系统日志记录的默认条目。在 systemd 实现(这种情况下)的情况下,它是任何/run/systemd/journal/dev-log. 它曾经是由 syslog 守护进程处理的 unix socket 的接收端。
~$ echo "hello" > /dev/log
bash: /dev/log: No such device or address
~$ fuser /dev/log
~$ ls -la /dev/log
lrwxrwxrwx 1 root root 28 Aug 23 07:13 /dev/log -> /run/systemd/journal/dev-log
Run Code Online (Sandbox Code Playgroud)
当您尝试写入时弹出的错误的澄清是什么,为什么没有一个进程保存该文件(从fuser /dev/log空输出?
日志记录在系统上正常工作。
~$ logger test
~$ journalctl --since=-1m
-- Logs begin at Thu 2018-05-24 04:23:46 CEST, end at Thu 2018-08-23 13:07:25 CEST. --
Aug 23 13:07:24 alan-N551JM alan[12962]: test
Run Code Online (Sandbox Code Playgroud)
使用评论建议进行扩展
~$ sudo fuser /dev/log
/run/systemd/journal/dev-log: 1 311
~$ ls -lL /dev/log
srw-rw-rw- 1 root root 0 Aug 23 07:13 /dev/log
Run Code Online (Sandbox Code Playgroud)
and*_*coz 10
我正在将评论总结为一个完整的答案。请注意,@MarkPlotnick是第一个指出正确解决方案的人。
正如您在ls -lL输出中看到的,您链接指向的文件是一个socket,非常规文件或管道。
~$ ls -lL /dev/log
srw-rw-rw- 1 root root 0 Aug 23 07:13 /dev/log
Run Code Online (Sandbox Code Playgroud)
查看输出的第一个字符。这s意味着该文件是一个套接字。
不能使用重定向机制>的bash(或者,AFIK,其他任何壳)写的一个插座,因为shell会尝试打开该文件,open不支持插座。有关详细信息,请参阅man open。
您必须使用连接到套接字的程序。有关详细信息,请参阅man connect。
例如,您可以使用netcator socat(请参阅如何通过 Debian Squeeze 上的 shell 与 Unix 域套接字通信?)。
为了完整起见,您可以在管道上使用重定向。
~$ mkfifo /tmp/fifo
~$ ls -l /tmp/fifo
prw-rw-rw- 1 root root 0 27 ago 15.04 /tmp/fifo
~$ echo "hello" > /tmp/fifo
Run Code Online (Sandbox Code Playgroud)
查看ls输出的第一个字符。这p意味着该文件是一个管道。
小智 6
要向接受的(正确)答案添加一些附加信息,您可以/dev/log通过如下写入来查看只是 UNIX 套接字的程度:
lmassa@lmassa-dev:~$ echo 'This is a test!!' | nc -u -U /dev/log
lmassa@lmassa-dev:~$ sudo tail -1 /var/log/messages
Sep 5 16:50:33 lmassa-dev journal: This is a test!!
Run Code Online (Sandbox Code Playgroud)
在我的系统上,您可以看到 journald 进程正在侦听此套接字:
lmassa@lmassa-dev:~$ sudo lsof | grep '/dev/log'
systemd 1 root 29u unix 0xffff89cdf7dd3740 0t0 1445 /dev/log
systemd-j 564 root 5u unix 0xffff89cdf7dd3740 0t0 1445 /dev/log
Run Code Online (Sandbox Code Playgroud)
它收到我的消息并用它做它的事情:(即附加到 /var/log/messages 文件)。
请注意,因为 journald 所说的 syslog 协议需要数据报(认为 UDP),而不是流(认为 TCP),如果您只是尝试直接写入套接字,nc您将在系统调用中看到错误(并且没有日志显示) .
相比:
lmassa@lmassa-dev:~$ echo 'This is a test!!' | strace nc -u -U /dev/log 2>&1 | grep connect -B10 | egrep '^(socket|connect)'
socket(AF_UNIX, SOCK_DGRAM, 0) = 4
connect(4, {sa_family=AF_UNIX, sun_path="/dev/log"}, 10) = 0
lmassa@lmassa-dev:~$ echo 'This is a test!!' | strace nc -U /dev/log 2>&1 | grep connect -B10 | egrep '^(socket|connect)'
socket(AF_UNIX, SOCK_STREAM, 0) = 3
connect(3, {sa_family=AF_UNIX, sun_path="/dev/log"}, 10) = -1 EPROTOTYPE (Protocol wrong type for socket)
Run Code Online (Sandbox Code Playgroud)
注意,为了清楚起见,我省略了一些系统调用。这里的重点是第一个调用指定了 SOCK_DGRAM,这是 /dev/log 套接字所期望的(因为这是/dev/log最初创建套接字的方式),而第二个调用没有,所以我们得到了一个错误。