![rsyslog 不记录日志](https://linux22.com/image/53135/rsyslog%20%E4%B8%8D%E8%AE%B0%E5%BD%95%E6%97%A5%E5%BF%97.png)
这是一个奇怪的问题。
我正在 RHEL7 VM 上测试 chrony/ntp 服务,并重置其时间以及主机的时间。当我对它感到满意后,我检查了一下/var/log/messages
,发现它已经有一段时间没有改变了。
现在,无论我做什么,除了重新启动 rsyslog 服务本身之外,都不会被记录;当我这样做时我得到这个:
Apr 15 13:59:43 mymachine1 rsyslogd: [origin software="rsyslogd" swVersion="7.4.2" x-pid="2847" x-info="http://www.rsyslog.com"] exiting on signal 2.
Apr 15 13:59:59 mymachine1 rsyslogd: [origin software="rsyslogd" swVersion="7.4.2" x-pid="2853" x-info="http://www.rsyslog.com"] start
Apr 15 14:00:11 mymachine1 rsyslogd-3000: sd_journal_get_cursor() failed: 'Cannot assign requested address'
尝试诸如logger test
“不记录”之类的事情,除了 rsyslog 自己的消息之外,似乎没有其他任何事情。当我使用参数手动运行 rsyslog 时,-n -N1
我得到:
rsyslogd: version 7.4.2, config validation run (level 1), master config /etc/rsyslog.conf
rsyslogd: End of config validation run. Bye
由于某种原因,似乎没有任何内容可以通过 rsyslog 进行记录。同一台主机上的第二个相同的虚拟机(没有经历重复禁用 ntp、更改日期并重新启动多次的完全相同的循环)具有相同的 rsyslog.conf 文件日志也很好。
此时,日期/时间是正确的,chrony 已启用并正在运行,并且我已经重新启动了几次 - 在 30 秒的内核消息之后,没有再记录任何其他内容。
想法?
答案1
这不是直接的解决方案,但我会启用一些调试来查看幕后发生的情况。
想法#1 - 调试记录器
对于初学者来说,当您运行logger
命令时,您可以像这样执行它们,将消息回显到 STDERR。
$ logger -s "hi"
saml: hi
想法 #2 - 验证您的配置文件
您还可以尝试验证 rsyslog 配置文件:
$ sudo rsyslogd -N6 | head -10
rsyslogd: version 7.2.6, config validation run (level 6), master config /etc/rsyslog.conf
rsyslogd: End of config validation run. Bye.
6921.173842409:7f8b11df2780: rsyslogd 7.2.6 startup, module path '', cwd:/root
6921.175241008:7f8b11df2780: caller requested object 'net', not found (iRet -3003)
6921.175261977:7f8b11df2780: Requested to load module 'lmnet'
6921.175272711:7f8b11df2780: loading module '/lib64/rsyslog/lmnet.so'
6921.175505384:7f8b11df2780: module lmnet of type 2 being loaded (keepType=0).
6921.175520208:7f8b11df2780: entry point 'isCompatibleWithFeature' not present in module
6921.175528413:7f8b11df2780: entry point 'setModCnf' not present in module
6921.175535294:7f8b11df2780: entry point 'getModCnfName' not present in module
6921.175541502:7f8b11df2780: entry point 'beginCnfLoad' not present in module
想法 #3 - 打开 rsyslogd 调试
另外,我会尝试启用rsyslogd
守护进程的调试以获得进一步的了解。
$ sudo -i
$ export RSYSLOG_DEBUGLOG="/tmp/debuglog"
$ export RSYSLOG_DEBUG="Debug"
$ service rsyslog stop
$ rsyslogd -d | head -10
7160.005597645:7fae096a3780: rsyslogd 7.2.6 startup, module path '', cwd:/root
7160.005872662:7fae096a3780: caller requested object 'net', not found (iRet -3003)
7160.005895004:7fae096a3780: Requested to load module 'lmnet'
7160.005906331:7fae096a3780: loading module '/lib64/rsyslog/lmnet.so'
7160.006023505:7fae096a3780: module lmnet of type 2 being loaded (keepType=0).
7160.006030872:7fae096a3780: entry point 'isCompatibleWithFeature' not present in module
7160.006033780:7fae096a3780: entry point 'setModCnf' not present in module
7160.006036209:7fae096a3780: entry point 'getModCnfName' not present in module
7160.006038359:7fae096a3780: entry point 'beginCnfLoad' not present in module
...
...
7160.006063913:7fae096a3780: rsyslog runtime initialized, version 7.2.6, current users 1
7160.006102179:7fae096a3780: source file syslogd.c requested reference for module 'lmnet', reference count now 2
7160.006113657:7fae096a3780: GenerateLocalHostName uses 'greeneggs'
确认版本信息
$ rsyslogd -version
rsyslogd 7.2.6, compiled with:
FEATURE_REGEXP: Yes
FEATURE_LARGEFILE: No
GSSAPI Kerberos 5 support: Yes
FEATURE_DEBUG (debug build, slow code): No
32bit Atomic operations supported: Yes
64bit Atomic operations supported: Yes
Runtime Instrumentation (slow code): No
uuid support: Yes
See http://www.rsyslog.com for more information.
已确认的错误和解决方法
OP 将此作为错误提交给红帽。
该错误的特征如下:
果然,当我设置主机自己的时间时,虚拟机的时间与主机的错误时间相同。那时我注意到 /var/log/messages 不再更新。
事实证明,除了重新启动 rsyslog 服务本身记录到文件之外,别无其他。如果我这样做,则会记录:
--- Apr 15 16:39:39 rhel7time-dev rsyslogd-3000: sd_journal_get_cursor() failed: 'Cannot assign requested address' Apr 15 16:39:39 rhel7time-dev rsyslogd: [origin software="rsyslogd" swVersion="7.4.2" x-pid="574" x-info="http://www.rsyslog.com"] exiting on signal 15. Apr 15 16:39:39 rhel7time-dev rsyslogd: [origin software="rsyslogd" swVersion="7.4.2" x-pid="2117" x-info="http://www.rsyslog.com"] start ---
否则,不会将任何内容记录到文件中,包括记录器。
如果我在 rsyslog.conf 中注释掉 $OmitLocalLogging,则文件日志记录将恢复(请注意,直到那时我还没有更改 rsyslog.conf)。
通过日志记录不受这一切的影响。 Journalctl -b 显示日志记录,包括记录器发送的任何内容。
对此,一位开发商做出了回应:
出现此问题时,您可以删除
/var/lib/rsyslog/imjournal.state
并重新启动守护程序作为解决方法。rsyslog 不直接处理日期,而只能通过 systemd API 处理。我不久前检查过 imjournal 中的代码,这看起来像是 systemd 中的问题。
答案2
就我而言systemctl restart systemd-journald
有帮助,因为
File /run/log/journal/29c32d60f93c42489aabb4ebeb593f5b/system.journal corrupted or uncleanly shut down, renaming and replacing.
[12274404.541271] systemd-journald[15492]: Deleted empty journal /run/log/journal/29c32d60f93c42489aabb4ebeb593f5b/[email protected]~ (4096 bytes).
答案3
尝试使用以下命令检查 rsyslogconf:rsyslogd -f /etc/rsyslog.conf -N 1
如果一切正常,请尝试使用以下命令重新启动 systemd-journald.socket:
systemctl restart systemd-journald.socket
您可以使用命令“logger”检查 rsyslog 是否工作:记录器“你好”
答案4
Journald 和 rsyslogd 之间存在令人惊讶的脆弱依赖性,尤其是在 RHEL7 中。 Journald 成为第一个规范的日志处理程序。它应该处理发送到 rsyslogd 的日志/dev/log
并将其转发到 rsyslogd。然而,rsyslogd 的默认安装将尝试从/dev/log
. RHEL 包管理器确实通过添加指令来规避这一点
$SystemLogSocketName /run/systemd/journal/syslog
systemd-journald.socket
这是 rsyslog 创建并将写入的套接字的路径。该单元还创建/dev/log
并触发 的开始systemd-journald.service
。
但如果由于某种原因缺少该指令或者某处配置中存在非致命错误rsyslogd
,它将使用默认/dev/log
值重新创造该套接字以便它可以监听。这有两个效果:
- 进程发送的消息将
/dev/log
不会到达日志。 - 日志消息不会到达 rsyslogd
因此,要调试此问题,您可以重新启动 rsyslog 服务并检查 上的时间戳/dev/log
。如果时间匹配,则说明您在某处出现配置错误,或者缺少该指令。