如何在systemd + rsyslog主机中还原`/ dev / log`?


10

在RHEL7上,要systemd-journald接管曾经由承担的许多责任rsyslogd。无论是由于错误还是这两个守护程序之间的冲突,有时/dev/log都将丢失。结果,依赖于该syslog(3)调用的程序将无法正常运行,例如包括logger。如何恢复/dev/log套接字?

Answers:


13

问和回答我自己的问题,因为Google在这方面不是很有帮助。

通常,使用rsyslogdimuxsock模块将/dev/log自行创建套接字,在创建前取消链接上一个条目。当stoprsyslogd停止(可能是由于重新启动由于配置错误而失败)时,rsyslogd将删除 /dev/log

但是,随附提供的rsyslog RHEL7预期与结合使用systemd,并且该imuxsock模块实际上将打开并卸下/run/systemd/journal/syslog套接字。同时,该/dev/log设备由systemd-journald.socket触发的系统服务文件创建journald

显然,无论是否$imjournal使用模块,以下工作。

总而言之,如果/dev/log消失了:

  1. 重新启动systemd-journald.socket:

    systemctl restart systemd-journald.socket
    
  2. 然后重新启动rsyslogd

    systemctl start rsyslogd
    

更新:restart rsyslogd如果rsyslogd已经运行,我相信可能会重新删除套接字。


2
非常感谢!我只是花了几个小时来追查为什么日志记录无法用于某项服务。我终于找到了丢失的/ dev / log,将其引向您的解决方案。
乍得·休尼卡特

4

systemctl restart systemd-journald.socket && systemctl restart rsyslog解决方案在Ubuntu 16.04上对我不起作用。

相反,我不得不重新创建/dev/log为以下内容的符号链接/run/systemd/journal/dev-log

ln -s /run/systemd/journal/dev-log /dev/log

是的,手动链接也应该起作用。但是要记住它有点笨拙。问题:在Ubuntu上是否systemd-journald.socket存在服务?Q2:也许restart rsyslogd是问题所在?也许应该只是start rsyslogd
Otheus

问题1:是的,它存在。Q2:restart不再有命令,有service/etc/init.d/rsyslog
7181年

通过restart rsyslogd我认为这是明确的意思我systemctl restart rsyslogd。Ubuntu是否仍然使用rsyslog的初始化脚本?
Otheus

@Otheus /etc/init.d/rsyslog stop随后/etc/init.d/rsyslog start没有帮助。systemctl stop syslog.socket rsyslog.service && systemctl start syslog.socket rsyslog.service在我的系统上也没有/lib/systemd/system/rsyslog.service/etc/init.d/rsyslog。无论如何,我宁愿不花更多时间在这个问题上。
7181年

0

对我而言,这最终成为rsyslog中使用的imuxsock模块与systemd一起工作的问题。

imuxsock文档中,他们逐步介绍了该模块如何为systemd工作。步骤1是我看到问题的地方:

步骤1:选择系统套接字的名称

  1. 如果用户未明确选择设置SysSock.Use =“ off”,则默认侦听器套接字(即“系统日志套接字”或简称为“系统套接字”)名称设置为/ dev / log。否则,如果用户已显式设置SysSock.Use =“ off”,则rsyslog将不会侦听/ dev / log或SysSock.Name参数定义的任何套接字,并且本节的其余部分不适用。

  2. 如果用户已指定sysSock.Name =“ / path / to / custom / socket”(并且未明确设置SysSock.Use =“ off”),则默认侦听器套接字名称将被/ path / to / custom / socket覆盖。

  3. 否则,如果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上报告的此问题的结果。如果要跳过讨论并直接跳转到更改,请分别参阅PR#1PR#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尝试激活该服务时需要使用该别名。也有可能多个日志记录服务尝试为syslog.service加上别名,在这种情况下最后一次启用将获胜。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.