启用imtcp模块并配置多线程、队列与专用ruleset可实现高性能TCP日志接收:加载module(load="imtcp" MaxSessions="500" Threads="4"),监听port="514"绑定ruleset="remote",定义模板分时分IP存储,启用LinkedList队列防洪峰,最后验证监听、线程及队列状态。

用 imtcp 模块实现高性能 TCP 日志接收,核心在于启用模块、合理配置监听参数、启用多线程与队列机制,并配合模板和规则集做高效路由。rsyslog 本身支持并发处理,但默认配置往往未开启全部能力,需手动调优。
启用并配置 imtcp 输入模块
rsyslog 的 imtcp 是专为高可靠、高吞吐 TCP 日志接收设计的输入模块,比 UDP 更稳定,且支持连接复用和流控。必须显式加载并配置:
- 编辑
/etc/rsyslog.conf或新建/etc/rsyslog.d/10-tcp-input.conf - 加载模块:
module(load="imtcp" MaxSessions="500" Threads="4")
其中MaxSessions控制最大并发连接数(建议设为 200–1000),Threads指定处理线程数(通常设为 CPU 核心数或略高) - 添加监听规则:
input(type="imtcp" port="514" ruleset="remote")
这里将所有 TCP 连接绑定到自定义规则集remote,避免干扰本地日志流程
定义专用规则集提升并发隔离性
把远程日志单独走一个规则集,可避免与本地日志(如 RSYSLOG_DefaultRuleset)争抢资源,也便于独立限速、限流或丢弃异常连接:
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
- 声明规则集:
ruleset(name="remote") { - 在规则集中加过滤逻辑,例如只收特定网段:
if $fromhost-ip startswith '192.168.10.' then { - 使用模板按 IP + 时间分目录存储,减少单目录文件数量压力:
$template RemoteByHour,"/var/log/remote/%FROMHOST-IP%/%$YEAR%%$MONTH%%$DAY%-%$HOUR%.log" - 写入动作:
*.* ?RemoteByHour,末尾加& ~表示匹配后终止处理,不落入默认规则集 - 闭合规则集:
}
启用队列与内存缓冲防突发冲击
当客户端日志洪峰到来时(如批量重启、脚本刷日志),无缓冲的直接写盘会导致阻塞甚至丢包。应为 TCP 输入配置异步队列:
- 在
input()后追加队列参数:input(type="imtcp" port="514" ruleset="remote" queue.type="LinkedList" queue.size="100000" queue.dequeuebatchsize="1000") -
queue.type="LinkedList"提供高吞吐低延迟;queue.size建议设为 5w–20w(视内存而定);dequeuebatchsize控制每次取多少条批量写入,减少 I/O 次数 - 若磁盘较慢,还可启用磁盘辅助队列:
queue.filename="tcp_queue"+queue.maxdiskspace="1g",防止内存溢出
验证与调优关键点
配置完务必验证是否真正生效,尤其注意端口监听模式和线程行为:
- 检查监听状态:
ss -tlnp | grep :514确认是rsyslogd在监听,且协议为tcp - 查看线程数:
ps -T -p $(pgrep rsyslogd) | wc -l应 ≥ 配置的Threads值 - 测试并发连接:
for i in {1..100}; do logger -n 192.168.99.99 -P 514 "test msg $i" & done,观察日志落盘是否完整、无重复或丢失 - 监控队列积压:
rsyslogd -N1可语法检查,systemctl status rsyslog查看是否有 “queue full” 警告










