Rsyslog-基于TCP/UDP协议的跨网络日志集中管理实践

发布时间:2026/6/22 17:45:34

Rsyslog-基于TCP/UDP协议的跨网络日志集中管理实践 1. 为什么需要跨网络集中管理日志想象一下你管理着几十台服务器每台服务器都在本地生成大量日志文件。当系统出现故障时你需要挨个登录每台服务器查看日志这简直就是运维人员的噩梦。我曾经在一个项目上吃过这个亏半夜被叫起来排查问题结果花了两个小时才找到是哪台服务器的日志报错。集中式日志管理可以解决这个问题。通过Rsyslog我们可以把所有服务器的日志实时传输到一个中央日志服务器上。这样不仅方便查看和分析还能实现日志的长期归档和安全存储。在实际项目中我通常会选择Rsyslog而不是其他日志工具因为它轻量、稳定而且几乎所有的Linux发行版都预装了它。2. 环境准备与基础配置2.1 安装与验证Rsyslog虽然大多数现代Linux系统都预装了Rsyslog但最好还是确认一下。执行以下命令检查rpm -qi rsyslog # CentOS/RHEL # 或者 dpkg -l rsyslog # Ubuntu/Debian如果没安装可以用yum或apt快速安装yum install -y rsyslog # CentOS/RHEL # 或者 apt-get install -y rsyslog # Ubuntu/Debian我建议准备至少三台服务器来做这个实验两台作为日志生成端比如10.0.0.7和10.0.0.8一台作为日志接收端10.0.0.18。在实际生产环境中这个架构可以按需扩展。2.2 配置日志接收端首先在日志接收端10.0.0.18上配置。打开Rsyslog的主配置文件vim /etc/rsyslog.conf找到下面这两行通常在文件底部去掉前面的注释符号# 启用UDP模块 $ModLoad imudp $UDPServerRun 514 # 启用TCP模块 $ModLoad imtcp $InputTCPServerRun 514这里有个小技巧我习惯把端口号定义成一个变量方便后期修改# 定义端口变量 $Define LogPort 514 # 然后引用这个变量 $UDPServerRun $LogPort $InputTCPServerRun $LogPort保存后重启Rsyslog服务systemctl restart rsyslog验证端口是否监听成功ss -tulnp | grep 514你应该能看到514端口的TCP和UDP监听状态。如果没看到可能是防火墙挡住了记得开放端口firewall-cmd --add-port514/tcp --permanent firewall-cmd --add-port514/udp --permanent firewall-cmd --reload3. 配置日志发送端3.1 基本UDP配置在日志发送端10.0.0.7和10.0.0.8上我们需要配置将日志转发到中央服务器。编辑同样的配置文件vim /etc/rsyslog.conf在文件末尾添加假设使用UDP协议*.info;mail.none;authpriv.none;cron.none 10.0.0.18这个配置的意思是*.info转发所有info级别及以上的日志mail.none等排除邮件、认证、定时任务等特定类型的日志符号表示使用UDP协议如果使用TCP协议要用符号重启服务使配置生效systemctl restart rsyslog3.2 测试日志发送在发送端生成一条测试日志logger This is a test log message via UDP然后在接收端查看日志是否收到tail -f /var/log/messages # 或者更专业的查看方式 tail -f /var/log/messages | grep test log message如果一切正常你应该能看到这条测试日志。如果没看到可以从这几个方面排查网络连通性ping一下防火墙设置Rsyslog服务状态配置文件语法是否正确4. TCP与UDP协议的选择与实践4.1 协议特性对比在实际项目中我两种协议都用过总结了一些经验UDP协议特点传输速度快开销小无连接不需要握手没有确认机制可能丢包适合局域网环境对可靠性要求不高的场景TCP协议特点可靠传输有确认机制有连接过程三次握手传输效率略低适合跨公网或对可靠性要求高的场景这里有个真实的教训曾经在一个项目中我们全部使用UDP协议传输日志结果某天网络出现波动丢失了大约15%的关键日志导致故障排查非常困难。从那以后对于关键业务日志我一律推荐使用TCP协议。4.2 TCP协议配置要使用TCP协议发送端的配置稍有不同# 使用表示TCP协议 *.info;mail.none;authpriv.none;cron.none 10.0.0.18接收端的配置我们之前已经完成了同时启用了TCP和UDP。重启服务后可以用以下命令测试TCP传输# 发送端 logger This is an important log via TCP # 接收端 tcpdump -i any port 514 -vv这个tcpdump命令可以让你看到实际的TCP握手过程非常有助于理解背后的工作原理。5. 高级配置与优化建议5.1 日志分类存储默认情况下所有远程日志都混在一起存在/var/log/messages中这很不方便。我们可以修改接收端配置按主机名或IP分类存储# 在接收端的rsyslog.conf中添加 $template RemoteLogs,/var/log/remote/%HOSTNAME%/messages *.* ?RemoteLogs这个配置会为每台主机创建单独的目录以主机名命名目录将各自的日志存在对应的目录中重启服务后你会发现日志被自动分类存储了。我在一个客户的生产环境中部署这个方案后他们的日志查找效率提高了70%。5.2 性能调优参数当处理大量日志时可能需要调整一些性能参数# 增大队列大小 $WorkDirectory /var/lib/rsyslog $MainMsgQueueSize 50000 # 主队列大小 $ActionQueueSize 100000 # 动作队列大小 # 启用磁盘辅助队列 $ActionQueueFileName queue $ActionQueueMaxDiskSpace 1g $ActionQueueSaveOnShutdown on $ActionQueueType LinkedList $ActionResumeRetryCount -1这些参数的意思是增大内存队列大小减少磁盘IO当内存队列满时使用磁盘队列即使服务重启也不会丢失队列中的日志5.3 加密传输配置对于跨公网的日志传输安全性很重要。Rsyslog支持TLS加密配置稍微复杂一些首先在接收端生成证书# 创建证书目录 mkdir /etc/rsyslog.d/tls cd /etc/rsyslog.d/tls # 生成CA证书 openssl req -x509 -newkey rsa:2048 -days 3650 -nodes -out ca-cert.pem -keyout ca-key.pem # 生成服务器证书 openssl req -newkey rsa:2048 -nodes -out server-cert.csr -keyout server-key.pem openssl x509 -req -in server-cert.csr -CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem -days 3650然后在接收端配置# 加载GTLS模块 $DefaultNetstreamDriver gtls $DefaultNetstreamDriverCAFile /etc/rsyslog.d/tls/ca-cert.pem $DefaultNetstreamDriverCertFile /etc/rsyslog.d/tls/server-cert.pem $DefaultNetstreamDriverKeyFile /etc/rsyslog.d/tls/server-key.pem $ModLoad imtcp $InputTCPServerStreamDriverMode 1 # 启用TLS $InputTCPServerStreamDriverAuthMode anon $InputTCPServerRun 514发送端也需要类似配置只是使用客户端证书。这样配置后所有日志传输都会加密安全性大大提高。6. 常见问题排查在实际部署中我遇到过各种各样的问题这里分享几个典型案例问题1日志接收不全检查网络连通性确认防火墙设置查看Rsyslog服务日志journalctl -u rsyslog -f问题2性能瓶颈调整队列参数如前面所述考虑使用RELP协议代替TCP/UDP需要额外安装rsyslog-relp增加接收端资源问题3日志格式混乱统一发送端和接收端的模板配置考虑使用RFC3164或RFC5424标准格式问题4证书验证失败检查证书有效期确认证书路径和权限验证证书链是否完整一个实用的调试技巧是启用Rsyslog的调试模式# 临时启用调试 rsyslogd -dn # 或者查看调试日志 journalctl -u rsyslog -f7. 生产环境部署建议根据我多年的实施经验在生产环境中部署Rsyslog集中管理时有几个关键点需要注意协议选择策略内网环境可以混合使用UDP和TCP跨公网必须使用TCPTLS关键业务日志只用TCP日志轮转配置 建议在接收端配置logrotate避免日志文件过大# /etc/logrotate.d/rsyslog-remote /var/log/remote/*/messages { daily missingok rotate 30 compress delaycompress sharedscripts postrotate /bin/kill -HUP cat /var/run/syslogd.pid 2 /dev/null 2 /dev/null || true endscript }监控与告警监控日志接收延迟设置磁盘空间告警监控Rsyslog进程状态容量规划预估日志量通常每天每台服务器100MB-1GB根据保留周期计算存储需求考虑使用压缩归档高可用方案 对于关键业务可以部署多台日志接收服务器并在发送端配置多个目标# 主日志服务器 *.info primary-log-server # 备份日志服务器 *.info secondary-log-server最后建议定期测试日志恢复流程确保在需要时能快速找到关键日志。我通常会每月做一次恢复演练确保团队熟悉整个流程。

相关新闻