想把 rsyslog 远程日志发送配置正确,核心要抓住四个关键点:客户端配置中,@ 表示 UDP,@@ 表示 TCP,两者必须严格区分,不能写错;服务端则要正确加载对应模块、开启端口监听、定义并调用模板,而且后面必须紧跟 &~;此外,在生产环境中一定要启用磁盘队列,否则最危险的不是配置报错,而是日志在无提示的情况下悄悄丢失。

rsyslog 默认不会主动发送远程日志,只要配置时写错一个符号、少加载一个模块,或者漏掉一个 &~,日志就会停留在本地不再转发——表面看似正常,实际上属于静默失败。
@ 和 @@ 必须严格区分,写错协议等于远程日志配置无效
在客户端 rsyslog 配置中,@ 代表 UDP,@@ 代表 TCP,这是固定语法,不能多写、少写,也不能混着用。
*.* @192.168.1.100:514:使用 UDP 发送日志,开销小但没有确认机制,适合内网短距离传输;同时防火墙必须放行514/udp*.* @@192.168.1.100:514:使用 TCP 转发日志,具备连接、重传和队列缓存能力,更适合生产环境,也是实际部署中更推荐的方式;服务端必须加载imtcp模块并监听514/tcp- 如果服务端只启用了
imudp,却接收到了@@的 TCP 转发请求,日志会被直接丢弃——此时用ss -tlnp | grep :514看不到 TCP 监听,用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$ActionQueueSa veOnShutdown 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,说明 rsyslog 仅监听本地回环地址,无法接收外部主机发来的日志
真正难处理的,往往不是多写几行 rsyslog 配置,而是后续这些容易被忽视的检查细节:每一台客户端,都要逐一确认磁盘队列是否真的生效;每一台日志服务端,也都要核实 imtcp 模块的加载顺序是否正确,以及 &~ 是否紧贴在模板调用之后。只要其中任意一个环节遗漏,Linux 远程日志传输就很容易中途卡住,最终导致日志收集失败。
