更改 VM 主机的时间会禁用 rsyslog 文件日志记录
2024.6.26 处理rsyslog日志记录异常
rsyslogd: [origin software="rsyslogd" swVersion="7.4.7" x-pid="15273" x-info="http://www.rsyslog.com"] start Jun 26 13:53:40 localhost rsyslogd-3000: sd_journal_get_cursor() failed: 'Cannot assign requested address'
sd_journal_get_cursor() 失败 - 此问题是由于rsyslog开源代码存在bug,当系统的时间被设置回较早的时间时,重新启动后,*imjournal* 组件不再具有指向最后一条日志消息的有效光标。因此,*imjournal* 完全停止记录到运行时日志,并且 *rsyslog* 服务器没有收到任何消息。如果主机时间较早,则虚拟机客户机从其主机获取时间也会触发此行为。
此问题在当前以及更早的rsyslog版本存在,在rsyslog-8.24.0-6.el7版本修复
修改记录如下:
diff -up ./plugins/imjournal/imjournal.c.time ./plugins/imjournal/imjournal.c
--- ./plugins/imjournal/imjournal.c.time 2016-12-21 17:50:13.849000000 +0100
+++ ./plugins/imjournal/imjournal.c 2016-12-21 18:20:03.908000000 +0100
@@ -538,7 +538,24 @@ loadJournalState(void)
"couldn't seek to cursor `%s'\n", readCursor);
iRet = RS_RET_ERR;
} else {
+ char * tmp_cursor = NULL;
sd_journal_next(j);
+ /*
+ * This is resolving the situation when system is after reboot and boot_id doesn't match
+ * so cursor pointing into "future". Usually sd_journal_next jump to head of journal due to journal aproximation,
+ * but when system time goes backwards and cursor is still invalid, rsyslog stops logging. We use
+ * sd_journal_get_cursor to validate our cursor. When cursor is invalid we are trying to jump to the head of journal
+ * This problem with time is not affecting persistent journal.
+ * */
+ if (sd_journal_get_cursor(j, &tmp_cursor) < 0 && sd_journal_has_persistent_files(j) == 0) {
+ errmsg.LogError(0, RS_RET_IO_ERROR, "imjournal: "
+ "loaded invalid cursor, seeking to the head of journal\n");
+ if (sd_journal_seek_head(j) < 0) {
+ errmsg.LogError(0, RS_RET_ERR, "imjournal: "
+ "sd_journal_seek_head() failed, when cursor is invalid\n");
+ iRet = RS_RET_ERR;
+ }
+ }
}
} else {
errmsg.LogError(0, RS_RET_IO_ERROR, "imjournal: "
在这段代码中,主要做了以下几件事情:
-
使用
sd_journal_next(j)将游标移动到日志中的下一个条目。 -
通过
sd_journal_get_cursor获取当前的游标,并将其存储在tmp_cursor中。 -
然后进行了一些逻辑判断:
- 如果
sd_journal_get_cursor失败,并且当前没有持久性的日志文件时(sd_journal_has_persistent_files(j) == 0),则会记录错误消息,指出加载了无效的游标,并尝试将游标移到日志的开头。 - 如果
sd_journal_seek_head(j)也失败,则记录另一条错误消息并设置返回错误码。
- 如果
这段代码处理了在加载日志状态时发现无效游标的情况,并尝试纠正此问题,确保rsyslog能够正确地处理游标和持续日志。
临时解决办法:
1.
rm -f /var/lib/rsyslog/imjournal.state service rsyslog restart
2.
/etc/rsyslog.conf中注释掉以下配置
$OmitLocalLogging on
仅为学习交流,侵删
本文来自博客园,作者:灯阑,转载请注明原文链接:https://www.cnblogs.com/denglan/p/18269166

浙公网安备 33010602011771号