rsyslog远程日志集中化需服务端tcp监听514端口并按客户端ip自动分目录存储,客户端用@@转发;关键步骤包括加载imtcp模块、定义remotelogs模板、创建授权目录、防火墙放行及重启服务验证。

配置 Rsyslog 实现远程系统日志集中化收集,关键在于服务端可靠接收并按源隔离存储,客户端稳定转发不丢日志。TCP 方式(@@)是生产环境首选,比 UDP 更可靠,且配置清晰、资源占用低。
服务端:监听 514 端口 + 按 IP 自动分目录
服务端不能只开个端口,必须明确“谁发来的、存哪、怎么命名”。核心动作有三步:
- 加载 TCP 接收模块:在 /etc/rsyslog.d/10-listen.conf 或 /etc/rsyslog.conf 中添加
module(load="imtcp")<br>input(type="imtcp" port="514")
- 定义模板,实现自动分目录:
$template RemoteLogs,"/var/log/remote/%FROMHOST-IP%/%$YEAR%-%$MONTH%-%$DAY%.log"<br>*.* ?RemoteLogs & ~
其中%FROMHOST-IP%提取真实客户端 IP,& ~防止日志重复写入本地文件 - 提前创建目录并授权:
sudo mkdir -p /var/log/remote<br>sudo chown syslog:adm /var/log/remote
权限不对不会报错,但日志会静默丢失
重启后验证:sudo systemctl restart rsyslog,再执行 ss -tlnp | grep :514,看到 rsyslogd 占用即成功。
客户端:用 @@ 转发 + 确保网络通达
客户端只需一条规则,但细节决定是否真能发出去:
- 新建配置文件 /etc/rsyslog.d/50-remote.conf,写入:
*.* @@192.168.1.100:514
注意是双 @(TCP),不是单 @(UDP),后者易丢日志 - 确认目标 IP 和端口可达:
nc -zv 192.168.1.100 514或telnet 192.168.1.100 514,不通就别继续 - 服务端防火墙放行:
Ubuntu/Debian:sudo ufw allow 514/tcp
RHEL/CentOS:sudo firewall-cmd --add-port=514/tcp --permanent && sudo firewall-cmd --reload
改完必须 sudo systemctl restart rsyslog —— reload 不会重载转发规则,无效。
验证与排错要点
常见“配了却没日志”,往往卡在几个隐性环节:
- 服务端目录权限不对、路径不存在,日志写不进磁盘,但无错误提示
- 客户端用了
@而非@@,或漏写了端口号(如写成@@192.168.1.100),导致连接被拒 - 版本差异引发 TLS 冲突:较新 rsyslog 默认启用 TLS,老服务端不支持,可在服务端加一行
$InputTCPServerStreamDriverMode 1关闭 TLS - 测试发送:客户端执行
logger "test from client",然后在服务端查/var/log/remote/客户端IP/2026-07-07.log
进阶建议:防丢与长期运维
中小规模场景用基础 TCP 已够用,但若日志关键、网络不稳定,可增强可靠性:
- 客户端加磁盘队列缓存(防止断网期间日志堆积丢失):
$ActionQueueFileName fwdRule1<br>$ActionQueueMaxDiskSpace 1g<br>$ActionQueueSaveOnShutdown on
- 服务端配置 logrotate,避免单日志文件无限增长撑爆磁盘
- 敏感环境启用 TLS 加密:需生成证书、配置 gnutls 模块,但会增加部署复杂度











