![rsyslog-如何刷新队列?](https://linux22.com/image/632919/rsyslog-%E5%A6%82%E4%BD%95%E5%88%B7%E6%96%B0%E9%98%9F%E5%88%97%EF%BC%9F.png)
我正在使用 rsyslog 从 haproxy 获取日志并将它们放入 elasticsearch/kibana 的 logstash 中。
一切正常,但我在 rsyslog 中发现了一些奇怪的东西。
我发现 kibana 中缺少数据。原因是 rsyslog。
磁盘上的队列被搁置并停止了几天
所以我缺少周末的数据,但昨天和今天的数据一切正常。
Rsyslog 现在获取数据并将它们放入 logstash,但他似乎忘记了存储在他自己的队列中的数据(我认为他看到它们已经很旧了,并且忽略了它们,有一个参数,也许使用了一些默认值?)
现在,logstash 处于空闲状态,我可以从 rsyslog 队列中强制向其提供许多附加数据
所以我想要做的是:
暂时尝试刷新此队列(如 postfix flush)或者如果这不可能,我应该尝试做什么?
我的 rsyslog 配置是:
$ActionSendTCPRebindInterval 500
$ActionQueueType LinkedList
$ActionQueueFileName kibana
$ActionQueueMaxFileSize 100m
$ActionQueueMaxDiskSpace 100g
$ActionQueueTimeoutEnqueue 0
$ActionResumeRetryCount -1
$ActionQueueSaveOnShutdown on
答案1
Rsyslog 磁盘队列可能由于不正常关机而卡住,从而导致假.qi
脱机目录中的文件与假脱机文件不同步。
在这种情况下,刷新/出队磁盘队列可能需要执行 Rsyslog 提供的附加脚本(但不包含在分发包中)。根据https://www.rsyslog.com/doc/concepts/queues.html#disk-queues
如果您碰巧丢失或者需要内务管理结构并且拥有所有队列块,则可以使用 rsyslog 包中包含的 perl 脚本来生成它。用法:
recover_qi.pl -w $WorkDirectory -f QueueFileName -d 8 > QueueFileName.qi
其中$WorkDirectory
的值是queue.spoolDirectory
,QueueFileName
的值是queue.fileName
。另请参阅:https://www.rsyslog.com/doc/rainerscript/queue_parameters.html
例子:
./recover_qi.pl -w /var/spool/rsyslog -f rsyslog_backlog -d 8 > /var/spool/rsyslog/rsyslog_backlog.qi
(在执行脚本之前停止 rsyslog 可能是一个好主意。)
这里是recover_qi.pl
Rsyslog git 存储库(单击“原始”以获取文件):https://github.com/rsyslog/rsyslog/blob/master/tools/recover_qi.pl