在我的计算机 (16.04.1) 上,似乎缺少 /dev/log。它可能一直都缺失。
这真实的我在这里寻求帮助的原因是我正在使用带有 csf 的 virtualmin 并且该SYSLOG_CHECK
选项总是失败(即使操作系统仍然是 14.04 可信)。
当我运行记录器时,会发生以下情况:
# logger hi there
logger: socket /dev/log: No such file or directory
我也尝试了 'python' 的做事方式,根据这个问题:
# python -c 'import syslog; syslog.syslog("Hello World")'
(nothing is outputted, or appears in syslog)
因此,查看/dev/
文件夹时我注意到那里根本没有“日志”。
我在另一台机器(v14.04)上检查过,它有:srw-rw-rw- 1 root root 0 Dec 16 20:34 log=
两台机器的主要区别在于,前者是从 vultr.com 启动的实例(使用他们提供的 cloud-init 感知安装),而后一台机器(可以运行)使用了 ubuntu ISO(很久以前)。
那么,问题是:我该如何解决为什么我没有/dev/log
某个应用程序 (csf) 可能试图写入的文件的问题?请注意,中还出现了其他消息/var/log/syslog
,所以对我来说这有点令人困惑。
任何帮助均感激不尽。
编辑:
/lib/systemd/system/systemd-journald-dev-log.socket 的内容:
[Unit]
Description=Journal Socket (/dev/log)
Documentation=man:systemd-journald.service(8) man:journald.conf(5)
DefaultDependencies=no
Before=sockets.target
IgnoreOnIsolate=yes
[Socket]
Service=systemd-journald.service
ListenDatagram=/run/systemd/journal/dev-log
Symlinks=/dev/log
SocketMode=0666
PassCredentials=yes
PassSecurity=yes
ReceiveBuffer=8M
SendBuffer=8M
答案1
检查你是否有/run/systemd/journal/dev-log
;它应该是一个套接字:
$ ls -l /run/systemd/journal/dev-log
srw-rw-rw- 1 root root 0 Dec 16 09:17 /run/systemd/journal/dev-log
如果检查无误,那么您可以简单地从/dev/log
到建立一个符号链接/run/systemd/journal/dev-log
:
sudo ln -s /run/systemd/journal/dev-log /dev/log
答案2
对我来说,这最终是 rsyslog 中使用的 imuxsock 模块与 systemd 协同工作时出现的问题。
在里面imuxsock 文档他们介绍了模块应该如何为 systemd 工作。第 1 步是我遇到问题的地方:
步骤 1:选择系统套接字的名称
如果用户未明确选择设置 SysSock.Use="off",则默认侦听器套接字(又称“系统日志套接字”或简称“系统套接字”)名称将设置为 /dev/log。否则,如果用户已明确设置 SysSock.Use="off",则 rsyslog 将不会侦听 /dev/log 或 SysSock.Name 参数定义的任何套接字,并且本节的其余内容不适用。
如果用户指定了 sysSock.Name="/path/to/custom/socket"(并且没有明确设置 SysSock.Use="off"),那么默认监听器套接字名称将被 /path/to/custom/socket 覆盖。
否则,如果 rsyslog 在 systemd 下运行并且 /run/systemd/journal/syslog 存在,(并且用户没有明确设置 SysSock.Use="off"),那么默认监听器套接字名称将被 /run/systemd/journal/syslog 覆盖。
系统本应进入步骤 3,将默认路径更改为“/run/systemd/journal/syslog”,但实际上它仍是“/var/log”。这意味着 imuxsock 模块将尝试(有时会成功)在 /dev/log 上创建套接字,而 systemd-journald-dev-log.socket 应该创建符号链接。如果无法创建真正的套接字,符号链接仍将被删除。
该文件是这个问题在 rsyslog github 上报告。如果你想跳过讨论直接跳到更改,请参阅公关#1和公关#2分别。
我的解决方案是仅配置 imuxsock 模块以使用 /etc/rsyslog.conf 中的 systemd 路径:
module(load="imuxsock"
SysSock.Name="/run/systemd/journal/syslog")
这似乎已经解决了我的问题,听起来像是一个很好的解决方案,因为它可以解释为什么符号链接在您手动创建它之后可能会再次消失。
如果您查看系统并且没有发现“/run/systemd/journal/syslog”,请查看“syslog.socket”以查看它是否成功启动,因为它负责创建套接字。
systemctl status syslog.socket
可能是您的 rsyslog.service 版本没有将 syslog.service 定义为别名,而 syslog.socket 尝试激活该服务时需要该别名。
不管怎样,我正在运行嵌入式版本的 Linux,因此它不能完美地复制这里的问题,但它似乎足够相关,值得分享。
答案3
很简单,重新启动 systemd-journald.service 就可以了
sudo systemctl 重启 systemd-journald.service
答案4
您确定安装了 rsyslog 吗?就我而言,我必须安装 rsyslog 才能解决 Ubuntu 16.04 中的问题:
sudo apt-get install -y rsyslog
请注意,甚至在我安装 rsyslog 之前,我的文件就/lib/systemd/system/systemd-journald-dev-log.socket
包含您在帖子中显示的相同内容。