Rsyslog 集中化日志实战:搭建高可靠日志服务器

用 Rsyslog 搭建集中化日志服务器完整教程——客户端 UDP/TCP/TLS/RELP 转发、服务端按主机分文件落盘、磁盘辅助队列防丢、与 logrotate 配合轮转。并讲解更近一步的做法:让 Rsyslog 直接转发给观测云 DataKit,省掉自建日志存储的运维负担。

最佳实践
Rsyslog 集中化日志实战:搭建高可靠日志服务器技术指南封面

集中化日志(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 做汇集和协议适配,把存储与分析交给观测云

  1. Rsyslog → DataKit:在 DataKit 所在主机开启 syslog 采集(TCP/UDP 514 或自定义端口),Rsyslog 客户端直接转发给 DataKit:
    *.* @@datakit-host:514
    
    或者在现有集中服务器上用 Rsyslog 再跳转发给 DataKit,原有架构零改动。
  2. 统一打标与解析:DataKit 采集配置中标注 service;用 Pipeline 把 syslog 头部解析出 timestatus,让不同设施的日志在观测云里字段对齐。
  3. 检索与告警:日志查看器按 hostservice 过滤、聚类分析快速扫全部机器的新模式;监控器的日志检测实现"某主机 5 分钟无日志上报"这类集中化特有的健康告警。
  4. 成本:多索引 + 存储策略管理留存,归档索引转存对象存储——比自建服务器扩磁盘省心得多。

常见问题(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。

系列阅读

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台