远程日志集中是怎么搭的
rsyslog 把多台机器的日志汇到一台日志服务器:客户端用 omfwd 转发(UDP 写单个 @,TCP 写 @@),服务端用 imtcp/imudp 接收并按主机名或程序名分文件落盘。集中之后才有条件做跨机关联分析。514 是 syslog 的标准端口,但传统 syslog 是明文传输,可能携带用户名、命令等敏感信息,跨公网必须加 TLS 或走内网专线。
基本信息
| 适用平台 | Linux(rsyslog 多为默认组件,注意与 syslog-ng 互斥) |
|---|---|
| 服务端模块 | imtcp、imudp、imrelp |
| 客户端模块 | omfwd(转发)、omrelp(可靠传输) |
| 配置位置 | /etc/rsyslog.conf 与 /etc/rsyslog.d/*.conf |
| 端口 | 514/udp 与 514/tcp;RELP 常用 20514 |
| 推荐 | TCP(@@) 优于 UDP(@),跨公网加 TLS |
典型使用场景
- 多台 Web 服务器日志集中留存,便于排查跨机请求链路
- 合规要求日志集中存储与保留期限管理
- 临时排障时集中观察所有节点日志(本地与远程双写)
- 作为采集层把日志统一转发到 ELK/SIEM 等平台
- 单机磁盘较小,把日志实时外送到大容量日志机
服务端与客户端
服务端与客户端
# 服务端 /etc/rsyslog.d/10-collect.conf
module(load="imtcp") # 加载 TCP 接收模块
input(type="imtcp" port="514") # 监听 514;生产务必限制来源网段
$template PerHost,"/var/log/remote/%HOSTNAME%/%PROGRAMNAME%.log"
*.* ?PerHost # 按主机名与程序名分目录落盘
firewall-cmd --permanent --add-port=514/tcp && firewall-cmd --reload
# 客户端 /etc/rsyslog.d/90-remote.conf
*.* @@10.0.0.20:514 # @@ 表示 TCP;单个 @ 是 UDP
# 只发指定设施:*.info;mail.none;authpriv.none @@10.0.0.20:514
sudo systemctl restart rsyslog
logger -p user.info 'remote test' # 在服务端 tail 验证端到端链路传输方式对照
| 写法/方式 | 协议 | 取舍 |
|---|---|---|
| @host:514 | UDP | 开销小但会静默丢日志(接收忙或网络拥塞时) |
| @@host:514 | TCP | 可靠有序、断线可重连,建议作为默认选择 |
| omrelp / imrelp | RELP | 带确认的可靠传输,更稳;服务端也要配对且用非标准端口 |
| StreamDriver(TLS) | TLS | 跨公网必须启用;需要管理证书,配置复杂度上升 |
| 本地文件 + 远程双写 | 本地与转发并行 | 远程链路故障时仍有本地副本,排查更安心 |
服务端接收量与磁盘要单独规划:所有主机日志合流后写入量是单机的多倍,写满会同时影响全部节点的排查能力,建议配 logrotate 与独立分区(或专门的日志存储)。
明文 syslog 里可能包含用户名、命令行与邮箱地址。跨不可信网络必须启用 TLS,至少也要限制来源 IP 并走内网专线。