rsyslog 官方无 imdiag 模块;可通过 imtcp/imfile 组合采集远程性能日志与本地 /proc/net/snmp 数据,配合 RainerScript 提取 TCP 重传等指标,并异步转发至分析服务,实现在线不中断链路诊断。

rsyslog 并没有官方名为 imdiag 的输入模块。当前 rsyslog 官方文档和稳定发行版(截至 2026 年)中,不存在 imdiag 模块。你可能混淆了以下几种情况:
常见误解来源
• pmnormalize 或 pmrfc5424 等解析模块:用于结构化日志提取字段,常被误称为“诊断模块”,但它们不采集系统指标,也不提供链路性能观测能力。
• imfile + 自定义脚本:有人用 imfile 监控 /proc/net/snmp、/proc/net/dev 等内核统计文件,再配合模板提取 TCP 重传、丢包等指标——这属于 DIY 方案,并非内置诊断模块。
• 厂商私有模块(如某些网络设备 SDK 中的 diag 输入插件):仅限特定硬件平台,不适用于通用 Linux rsyslog 部署。
真正可实现“在线不中断业务”的主干链路性能诊断方案
rsyslog 本身是轻量级日志管道,不直接测量网络延迟、吞吐或丢包。但它可以作为调度中枢,将来自不同来源的性能信号统一汇聚、标记、路由,从而支撑链路级诊断。关键在于组合使用标准模块:
-
输入层:用
imtcp或imudp接收远程设备(如交换机、边缘网关)发来的 RFC5424 格式性能 syslog(含 timestamp、src_ip、rtt_ms、loss_pct 字段);同时用imfile实时读取本地/proc/net/snmp和/proc/net/netstat中的 TCP 统计行(例如 “Tcp: 123456789 123456789 …”),通过property( name="msg" regex="Tcp:\s+(\d+)\s+(\d+)" )提取重传数。 -
规则层:用 RainerScript 编写条件判断,识别异常模式。例如:
if $msg contains "RTT_EXCEED_200MS" or $!rtt_ms > 200 then action(type="omfwd" target="perf-analyzer.example.com" port="514" protocol="tcp") -
输出层:将高优先级性能事件转发至专用分析服务(如 Telegraf + InfluxDB),普通日志仍写入本地磁盘;所有操作均异步、带内存队列(
queue.type="LinkedList"),不影响主业务日志流。
必须避开的典型陷阱
• 不要试图让 rsyslog 直接执行 ping 或 tcpping:这会引入阻塞调用,破坏其异步设计原则,导致日志堆积甚至丢失。
• 避免在 ruleset 中大量使用 exec 调用外部命令:每次 fork 开销大,且无法控制超时,易拖慢整个流水线。
• 不依赖单一时间戳字段做链路延时推算:syslog 时间戳由发送端生成,若设备时钟不同步,计算结果无意义。应结合 NTP 状态日志与 PTP 报文时间戳交叉验证。
推荐最小可行诊断链路配置片段
在 /etc/rsyslog.d/50-perf-diag.conf 中添加:
module(load="imtcp")
input(type="imtcp" port="601" ruleset="perf-rules")
<p>module(load="imfile")
input(type="imfile" File="/proc/net/snmp" Tag="tcp-snmp" Ruleset="perf-rules" RefreshTime="5")</p><p>ruleset(name="perf-rules") {
if $syslogtag == 'tcp-snmp:' and $msg startswith "Tcp:" then {
set $!tcp_retrans = re_extract($msg, "Tcp:s+d+s+(d+)", 0, 1, "0");
if $!tcp_retrans > 1000 then {
action(type="omfwd" protocol="tcp" target="analyzer.internal" port="514" template="PerfAlertTemplate")
}
}
}</p><p>template(name="PerfAlertTemplate" type="string" string="%TIMESTAMP% %HOSTNAME% PERF-ALERT TCP_RETRANS=%$!tcp_retrans%
")
该配置全程不重启 rsyslog 服务(systemctl reload rsyslog 即可生效),不干扰原有 *.* /var/log/messages 流程,满足“在线不中断”前提。


















