Answers:
问和回答我自己的问题,因为Google在这方面不是很有帮助。
通常,使用rsyslogd
,imuxsock
模块将/dev/log
自行创建套接字,在创建前取消链接上一个条目。当stoprsyslogd
停止(可能是由于重新启动由于配置错误而失败)时,rsyslogd将删除 /dev/log
。
但是,随附提供的rsyslog RHEL7
预期与结合使用systemd
,并且该imuxsock
模块实际上将打开并卸下/run/systemd/journal/syslog
套接字。同时,该/dev/log
设备由systemd-journald.socket
触发的系统服务文件创建journald
。
显然,无论是否$imjournal
使用模块,以下工作。
总而言之,如果/dev/log
消失了:
重新启动systemd-journald.socket:
systemctl restart systemd-journald.socket
然后重新启动rsyslogd
systemctl start rsyslogd
更新:restart rsyslogd
如果rsyslogd
已经运行,我相信可能会重新删除套接字。
该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
systemd-journald.socket
存在服务?Q2:也许restart rsyslogd
是问题所在?也许应该只是start rsyslogd
?
restart
不再有命令,有service
和/etc/init.d/rsyslog
。
restart rsyslogd
我认为这是明确的意思我systemctl restart rsyslogd
。Ubuntu是否仍然使用rsyslog的初始化脚本?
/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
。无论如何,我宁愿不花更多时间在这个问题上。
对我而言,这最终成为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上报告的此问题的结果。如果要跳过讨论并直接跳转到更改,请分别参阅PR#1和PR#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加上别名,在这种情况下最后一次启用将获胜。