要让一台linux主机作为日志服务器稳定接收并分类存储远程日志,核心是服务端监听tcp 514端口、客户端用@@tcp转发、按%fromhost-ip%模板分离存储、创建目录并赋权syslog:adm,再通过ss监听、systemctl状态、tail日志和logger测试四步验证链路。

要让一台 Linux 主机作为日志服务器,稳定接收并分类存储其他主机发来的日志,核心是服务端监听 + 客户端转发 + 路径模板 + 权限与验证四步闭环。不是加几行配置就能跑通,关键细节决定是否真正落地。
服务端:开启监听并按来源分离日志
默认 rsyslog 只处理本地日志,必须显式启用网络接收模块,并告诉它“谁的日志存哪”。
- 编辑 /etc/rsyslog.conf 或新建 /etc/rsyslog.d/remote.conf(推荐后者,避免污染主配置)
- 加载 TCP/UDP 模块(生产环境建议只开 TCP):
$ModLoad imtcp$InputTCPServerRun 514 - 定义模板,用客户端 IP 自动建目录:
$template RemoteLogs,"/var/log/remote/%FROMHOST-IP%/%PROGRAMNAME%.log" - 应用规则并终止后续匹配(防止日志重复写入本地文件):
*.* ?RemoteLogs & ~ - 创建目录并赋权:
sudo mkdir -p /var/log/remotesudo chown syslog:adm /var/log/remote
客户端:可靠转发,避免丢日志
明文 UDP 简单但不可靠;TCP 是底线,再加队列才能扛住网络抖动。
- 在客户端新建配置文件,如 /etc/rsyslog.d/50-remote.conf
- 使用 @@ 表示 TCP 转发(@ 是 UDP,不推荐用于生产):
*.* @@192.168.1.100:514(IP 替换为服务端真实地址) - 添加磁盘队列,断网时不丢日志:
$ActionQueueFileName fwdq1$ActionQueueMaxDiskSpace 1g$ActionQueueSaveOnShutdown on$ActionQueueTimeoutEnqueue 0 - 确保服务端 514/tcp 在防火墙放行:
sudo ufw allow 514/tcp或sudo firewall-cmd --add-port=514/tcp --permanent
验证是否真正生效
不能只看服务 restart 成功,要逐层确认数据链路完整。
- 检查服务端监听状态:
sudo ss -tlnp | grep :514(应看到 rsyslog 进程监听) - 检查 rsyslog 运行状态:
sudo systemctl status rsyslog(无 failed,且 Active: active (running)) - 手动触发一条测试日志(在客户端执行):
logger "test from $(hostname)" - 立刻在服务端查看对应 IP 目录下是否有新日志:
sudo tail -f /var/log/remote/客户端IP/syslog.log - 若无输出,查客户端 journalctl -u rsyslog,常见报错如 connection refused(端口不通)、no route to host(网络不通)、或 TLS 协商失败(版本不兼容)
常见卡点与应对
很多配置看似正确却收不到日志,问题往往藏在协议细节里。
- CentOS 7 服务端 + 较新 Debian 客户端:imtcp 默认启用 TLS,老版本不支持 → 在服务端加
$InputTCPServerStreamDriverMode 1关闭 TLS - 日志含中文显示乱码:确保服务端 locale 是 UTF-8(
locale | grep UTF-8),必要时在/etc/default/rsyslog中加RSYSLOGD_OPTIONS="-n -f /etc/rsyslog.conf" - 磁盘被日志撑爆:配合 logrotate 配置自动轮转,例如在
/etc/logrotate.d/rsyslog-remote中定义按天压缩、保留 30 天











