更改 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: "

  

在这段代码中,主要做了以下几件事情:

  1. 使用 sd_journal_next(j) 将游标移动到日志中的下一个条目。

  2. 通过 sd_journal_get_cursor 获取当前的游标,并将其存储在 tmp_cursor 中。

  3. 然后进行了一些逻辑判断:

    • 如果 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

 

posted @ 2024-06-26 15:15  灯阑  阅读(209)  评论(0)    收藏  举报