Rsyslog 集中化日志实战:搭建高可靠日志服务器
用 Rsyslog 搭建集中化日志服务器完整教程——客户端 UDP/TCP/TLS/RELP 转发、服务端按主机分文件落盘、磁盘辅助队列防丢、与 logrotate 配合轮转。并讲解更近一步的做法:让 Rsyslog 直接转发给观测云 DataKit,省掉自建日志存储的运维负担。
集中化日志(Centralized Logging)是指把多台机器的日志通过网络汇聚到一台(或一组)日志服务器统一存储和检索的架构——它解决三个问题:机器故障后日志仍可查、跨机器关联分析不用挨个登录、安全审计有独立副本。Rsyslog 是实现它的经典工具,本篇给出从零搭建的完整配置,并讨论何时该把"集中化的终点"从自建服务器换成观测云这样的托管平台。
核心要点速览
- 最小可用架构:服务端
imudp/imtcp接收 + 模板按主机名分文件;客户端*.* @server:514(UDP)或@@(TCP)转发。 - 生产环境至少上 TCP,丢不得的日志上 RELP 或 TLS+磁盘队列;UDP 只适合内网、可容忍少量丢失的场景。
- 集中化的终点不一定是文件:让 Rsyslog 把日志转发给 DataKit 的 syslog 输入,直接进入观测云,检索、告警、留存策略全部托管。
如何搭建 Rsyslog 日志服务器(接收端)?
/etc/rsyslog.d/10-server.conf:
# 加载接收模块
module(load="imudp")
input(type="imudp" port="514")
module(load="imtcp")
input(type="imtcp" port="514")
# 按"主机名/程序名"分文件落盘
template(name="RemoteHostFile" type="string"
string="/var/log/remote/%hostname%/%programname%.log")
# 来自远程的消息走模板,本地日志不受影响
if ($fromhost-ip != "127.0.0.1") then {
action(type="omfile" dynaFile="RemoteHostFile")
stop
}
建目录、放行防火墙、重启:
sudo mkdir -p /var/log/remote
sudo firewall-cmd --permanent --add-port=514/tcp --add-port=514/udp && sudo firewall-cmd --reload
sudo systemctl restart rsyslog
客户端如何转发?
/etc/rsyslog.d/90-forward.conf:
# UDP(一个 @)
*.* @192.168.1.10:514
# 或 TCP(两个 @)
*.* @@192.168.1.10:514
只想转发部分日志,用选择器过滤:auth,authpriv.* @@192.168.1.10:514(只转认证日志)。
UDP、TCP、RELP 怎么选?
| 协议 | 可靠性 | 说明 |
|---|---|---|
| UDP | 可能丢包 | 开销最小;内网、日志量大且少量丢失可接受时用 |
| TCP | 不丢包但可能重复/乱序 | 通用推荐;注意服务端连接数 |
| RELP | 端到端确认,不丢不重 | Rsyslog 生态专用协议,需要两端都装 rsyslog-relp;关键日志首选 |
RELP 配置(端口 2514 是惯例):服务端 module(load="imrelp") + input(type="imrelp" port="2514");客户端 module(load="omrelp") + *.* :omrelp:192.168.1.10:2514。
网络中断时如何不丢日志?
给转发动作挂磁盘辅助队列(客户端侧):
*.* @@192.168.1.10:514
$ActionQueueType LinkedList # 内存队列 + 磁盘溢出
$ActionQueueFileName fwdRule1 # 磁盘队列文件(/var/spool/rsyslog/ 下)
$ActionQueueMaxDiskSpace 1g # 最多用 1G 磁盘
$ActionQueueSaveOnShutdown on # 关机时落盘
$ActionResumeRetryCount -1 # 无限重试
服务器宕机期间,客户端日志在本地磁盘排队,恢复后自动补发——这是集中化架构可靠性的关键一环。
传输安全怎么做?
跨机房或跨公网必须上 TLS:用 gtls 网络流驱动(rsyslog-gnutls 包),服务端证书 + 客户端验证 StreamDriverAuthMode="x509/name",防止日志被窃听或伪造。内网可信环境可用防火墙白名单替代。
集中日志的轮转与清理
/etc/logrotate.d/remote-logs:
/var/log/remote/*/*.log {
daily
rotate 14
compress
missingok
notifempty
postrotate
/bin/kill -HUP `cat /var/run/rsyslogd.pid 2>/dev/null` 2>/dev/null || true
endscript
}
postrotate 发 HUP 让 rsyslog 重新打开文件句柄,否则它会继续写已轮转的 inode。
观测云落地:集中化的终点可以直接是观测云
自建日志服务器意味着你要自己维护磁盘、轮转、检索和告警。更轻的做法是保留 Rsyslog 做汇集和协议适配,把存储与分析交给观测云:
- Rsyslog → DataKit:在 DataKit 所在主机开启 syslog 采集(TCP/UDP 514 或自定义端口),Rsyslog 客户端直接转发给 DataKit:
或者在现有集中服务器上用 Rsyslog 再跳转发给 DataKit,原有架构零改动。*.* @@datakit-host:514 - 统一打标与解析:DataKit 采集配置中标注
service;用 Pipeline 把 syslog 头部解析出time和status,让不同设施的日志在观测云里字段对齐。 - 检索与告警:日志查看器按
host、service过滤、聚类分析快速扫全部机器的新模式;监控器的日志检测实现"某主机 5 分钟无日志上报"这类集中化特有的健康告警。 - 成本:多索引 + 存储策略管理留存,归档索引转存对象存储——比自建服务器扩磁盘省心得多。
常见问题(FAQ)
Q:服务器收到的日志时间戳乱怎么办? 客户端时钟不同步是主因,所有节点配 NTP/chrony;另外注意 syslog 传统格式不带年份,Rsyslog 模板建议用 RSYSLOG_ForwardFormat(含年份和高精度时间)。
Q:一万台客户端 UDP 打过来服务端扛得住吗? UDP 高并发下内核缓冲区易溢出丢包,调大 net.core.rmem_max 并给 imudp 配 rcvbufSize;更稳妥是分流到 TCP/RELP 或多台接收器 + 负载均衡。
Q:集中化日志需要保留多久? 看合规:等保、金融审计通常 6 个月起。用 logrotate 管理热数据,超期需求交给观测云归档索引或对象存储生命周期。
Q:容器环境还适合 Rsyslog 集中化吗? 容器主机的 /var/log/messages、syslog 依然可以用这套方案;容器自身的 stdout 日志建议直接用 DataKit 的容器日志采集(《Docker 日志驱动》),不必绕经宿主机 syslog。