rsyslog远程日志配置必须严格遵循四要素:客户端区分@(udp)与@@(tcp),服务端加载对应模块、监听端口、定义模板并紧跟&~,且生产环境须启用磁盘队列,否则日志静默丢失。

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也抓不到包
服务端接收配置缺一不可:模块 + 监听 + 模板 + &~
只写 input(type="imtcp" port="514") 不够,四个要素必须全齐,否则日志要么不进、要么重复落盘。
- 先加载模块:
module(load="imtcp")(TCP)或module(load="imudp")(UDP),放在/etc/rsyslog.conf开头或/etc/rsyslog.d/*.conf文件里 - 再加监听:
input(type="imtcp" port="514"),注意不要写成port="514/tcp"——rsyslogd -N1会报错 - 定义模板后必须显式调用:
*.* ?RemoteLogs,模板名大小写敏感,?remotelogs≠?RemoteLogs -
&~必须紧跟在?RemoteLogs后面,中间不能换行、不能空格,否则日志既写进远程目录,又继续落到/var/log/messages
生产环境必须配磁盘队列,否则网络一断就丢日志
TCP 可靠,但 rsyslog 默认不启用磁盘队列。没配 $ActionQueue 参数,服务端宕机或网络抖动时,日志照样丢。
- 加这三行(写在客户端配置文件开头或规则前):
$ActionQueueFileName fwdRule1$ActionQueueMaxDiskSpace 1g$ActionQueueSaveOnShutdown on - 队列参数必须和转发规则在同一作用域,
/etc/rsyslog.d/50-remote.conf里不能把队列写在文件末尾、规则写在开头 - 验证是否生效:
rsyslogd -N1输出里要有omfwd和action queue字样;systemctl status rsyslog里不能有queue full或disk full报错
排查要按“本机发出→网络通→远端收”顺序,别跳步
日志没到服务端,90% 是卡在这三处之一,每步都有对应验证命令,别靠猜。
- 本机是否发出:
tcpdump -i any port 514 -c 3,看到 UDP 包或 TCP SYN 就说明 rsyslog 已触发;没包就回头查rsyslogd -N1和模块加载 - 网络是否通:
nc -zv 192.168.1.100 514测 TCP,nc -u -zv 192.168.1.100 514测 UDP(部分nc版本不支持-u,换echo test | socat - udp:192.168.1.100:514) - 远端是否监听:
ss -tuln | grep :514,看输出里有没有0.0.0.0:514或[::]:514;只有127.0.0.1:514说明只监听本地回环,收不到外网日志
真正麻烦的不是写几行配置,而是每台客户端都要单独验证队列是否生效、每台服务端都要确认 imtcp 模块加载顺序和 &~ 是否紧跟模板调用——漏掉任意一环,日志就卡在半路。











