rsyslog默认不发远程日志,必须显式配置:@为udp、@@为tcp,协议符号不可错;生产环境须配$actionqueue参数启用磁盘队列防丢日志,并用rsyslogd -n1验证后重启服务。

默认不配置,rsyslog 就不会发远程日志——写错协议符号、漏加队列参数、没重启服务,日志就静默丢在本地。
客户端转发规则里 @ 和 @@ 必须严格区分
这是最常踩的坑:@ 表示 UDP,@@ 表示 TCP,语法硬性,不能混用,也不能多写或少写一个 @。
-
*.* @192.168.1.100:514:走 UDP,轻量但无确认,适合内网短距;防火墙需放行514/udp -
*.* @@192.168.1.100:514:走 TCP,有连接、重传、队列缓存,生产环境首选;服务端必须加载imtcp模块并监听514/tcp - 如果服务端只开了
imudp却收到@@请求,日志直接丢弃,ss -tlnp | grep :514看不到监听,tcpdump -i any port 514也抓不到包
生产环境必须加 $ActionQueue 参数防丢日志
TCP 虽可靠,但网络中断或服务端宕机时,没配队列照样丢日志。默认 rsyslog 不启用磁盘队列,必须显式声明。
- 在转发规则前加三行(建议放在
/etc/rsyslog.d/50-remote.conf开头): $ActionQueueFileName fwdRule1$ActionQueueMaxDiskSpace 1g$ActionQueueSaveOnShutdown on- 否则一旦服务端不可达,
rsyslog会直接丢弃日志,而不是暂存重试
配置改完必须 rsyslogd -N1 验证再重启
语法错误会导致整个 rsyslog 启动失败,但 systemd 可能只报 “failed to start”,看不出具体哪行错。
- 执行
rsyslogd -N1:检查语法,输出rsyslogd: version x.x.x, config validation successful才算通过 - 别跳过这步——模板名拼错、
?后面少空格、&~写成&~都会静默失败 - 验证通过后,再执行
systemctl restart rsyslog,否则配置不生效 - 用
logger "test message"发一条测试日志,立刻查服务端对应目录是否落盘
真正麻烦的不是写几行配置,而是每台客户端都要单独验证队列是否生效、每台服务端都要确认 imtcp 模块加载顺序和 &~ 是否紧跟模板调用——漏掉任意一环,日志就卡在半路。











