要让Syslog远程发送端真正可靠,必须配置TCP协议、磁盘队列、无限重试及TLS加密:启用@@协议,设置queue.type="LinkedList"、queue.filename、queue.saveonshutdown="on"、action.resumeRetryCount="-1",并用@@(o)走6514端口TLS双向认证。

要让 Syslog 远程发送端真正可靠,不能只写一行 *.* @@server:514 就完事。关键在于扛住网络抖动、服务端宕机、配置加载失败这三类常见断点——漏掉任一环节,日志就卡在本地磁盘里,无声无息地丢失。
协议选 TCP,但必须配队列
UDP 轻量但不保证送达,TCP 有连接和重传,但默认仍会丢日志:一旦服务端不可达或网络中断,rsyslog 会直接丢弃缓冲区内容(内存队列满即弃),除非你显式启用持久化磁盘队列。
- 使用
@@(双@)明确走 TCP 协议,避免误用@导致无确认传输 - 在规则前添加完整队列参数,例如:
\$ActionQueueMaxDiskSpace 1g
\$ActionQueueSaveOnShutdown on
\$ActionQueueType LinkedList
\$ActionResumeRetryCount -1
其中 -1 表示无限重试,LinkedList 启用磁盘-backed 队列,SaveOnShutdown 确保进程退出前刷盘。
配置验证不能跳过
rsyslog 对语法极其敏感,少个空格、模板名拼错、&~ 写成 & ~ 都会导致整条规则静默失效,而 systemd 日志只报 “failed to start”,看不出具体错误。
- 修改后必须运行
rsyslogd -N1语法校验,返回rsyslogd: configuration file /etc/rsyslog.conf: OK才算通过 - 验证通过再执行
systemctl restart rsyslog,否则新配置不生效 - 发一条测试日志:
logger "test remote log $(date)",立刻检查服务端对应目录是否落盘
防火墙与服务端状态联动检查
客户端配置再正确,若服务端没开 TCP 监听或防火墙拦截,日志照样发不出去。这不是客户端的问题,但排查时容易绕弯。
- 客户端侧可用
tcpdump -i any port 514抓包,确认是否有 SYN 包发出 - 服务端需确保
imtcp模块已加载且监听生效:ss -tlnp | grep :514应显示rsyslogd进程监听*:514 - 若只开了
imudp却收到@@请求,rsyslog 会直接丢弃,不报错也不记录
生产环境建议加 TLS 加密
明文走 514 端口存在中间人风险,尤其跨公网或混合云场景。启用 TLS 不仅防窃听,还能通过证书校验服务端身份,避免日志被劫持到伪造服务器。
- 服务端生成 CA 和服务端证书,启用
gtls模块并配置input(type="imtcp" port="6514" tls="on" ...) - 客户端配置
@@(o)server:6514((o)表示启用 TLS 校验)并指定 CA 证书路径 - 端口建议改用 6514(标准 syslog-tls 端口),避免与传统 514 冲突

















