rsyslog磁盘辅助队列通过内存+磁盘混合缓冲实现远程日志断网暂存与自动重传,需配置queue.type="LinkedList"、queue.filename、queue.saveonshutdown="on"及action.resumeRetryCount="-1"等关键参数。

用 rsyslog 配置磁盘辅助(disk-assisted)队列,核心目标是:当远程日志服务器不可达时,本地先将日志暂存到磁盘,等网络恢复再自动重传,从而避免日志丢失。这不是简单开启磁盘队列,而是要启用“内存+磁盘混合”的可靠缓冲机制。
启用磁盘辅助队列的关键配置项
rsyslog 的 disk-assisted 模式本质是:默认使用内存队列提升性能,当内存队列满或下游(如远程服务器)阻塞时,自动将新日志条目写入磁盘队列文件,实现无感降级。需在动作(action)前显式声明队列类型和参数:
- 在 /etc/rsyslog.d/50-remote.conf 或主配置中,为远程转发动作添加完整队列配置块
- 必须包含 $ActionQueueType LinkedList(启用磁盘辅助的前提)
- 必须设置 $ActionQueueFileName(指定磁盘队列文件前缀,如
remoteq) - 必须启用 $ActionResumeRetryCount -1(无限重试,避免丢弃)
- 建议设置 $ActionQueueSaveOnShutdown on(关机前刷盘,防断电丢失)
一个可直接使用的远程转发配置示例
以下配置将所有日志(*.*)异步、可靠地发往 192.168.10.100:514,并启用磁盘缓冲:
# 加载必要模块 module(load="imuxsock") # 本地日志输入 module(load="imklog") # 内核日志输入 module(load="omfwd") # 转发输出模块 <h1>定义远程转发动作,并绑定磁盘辅助队列</h1><p>action( type="omfwd" target="192.168.10.100" port="514" protocol="tcp" queue.type="LinkedList" queue.filename="remoteq" queue.maxdiskspace="1g" queue.saveonshutdown="on" queue.size="100000" queue.dequeuebatchsize="1000" action.resumeRetryCount="-1" action.reportSuspension="on" action.reportSuspensionContinuation="on" )
保存后执行 sudo systemctl restart rsyslog 生效。此时 rsyslog 会在 /var/lib/rsyslog/ 下创建 remoteq*.qf(队列索引)和 remoteq*.qi(数据块)文件。
验证磁盘队列是否生效
配置后需主动测试其容错能力:
- 临时关闭远程服务器或防火墙拦截 514 端口,观察本地是否持续生成日志
- 检查磁盘队列目录:
ls -lh /var/lib/rsyslog/remoteq*—— 应出现非空的 .qf/.qi 文件 - 查看 rsyslog 状态:
sudo rsyslogd -N1验证语法;sudo journalctl -u rsyslog | grep queue查看队列加载日志 - 恢复网络后,观察
remoteq*文件是否被自动清空,且远程服务器收到积压日志
关键注意事项与调优点
磁盘辅助队列不是“开箱即用就绝对可靠”,需注意几个易忽略细节:
-
磁盘空间必须独立且充足:
queue.maxdiskspace是硬上限,超出后新日志会被丢弃(除非设queue.discardseverity)。建议挂载专用小分区到/var/lib/rsyslog -
不要混用 legacy 和 RainerScript 语法:上面示例用的是新版 RainerScript(推荐),若用旧式
$Action...全局指令,需确保作用域覆盖对应 action -
TCP 比 UDP 更可靠:UDP 转发本身不保证送达,即使有磁盘队列,也仅缓存发送前的日志;务必用 TCP 并配
rebindInterval="60"防连接僵死 -
避免队列参数冲突:例如
queue.type="FixedArray"不支持磁盘,必须用LinkedList;queue.filename值不能含路径,只写文件名前缀


















