RouterOS日志收集实战:用rsyslog+MySQL搭建企业级日志服务器(CentOS7.6环境)
RouterOS日志中心化实战基于rsyslogMySQL的企业级日志架构设计当企业网络规模扩大到数十台RouterOS设备时分散在各个路由器上的日志就像散落的拼图碎片。去年我们遇到一次全网流量异常不得不逐台登录设备查询日志的经历让我深刻认识到集中化日志管理的重要性。本文将分享如何用rsyslogMySQL构建一个能处理日均百万级日志条目的企业级收集系统。1. 架构设计与环境规划在开始配置前我们需要理解整个系统的数据流向RouterOS设备通过UDP/TCP将日志推送到中央rsyslog服务器rsyslog的ommysql模块将日志结构化后写入MySQL数据库。这种架构相比传统的文件存储方式最大的优势在于查询效率提升通过索引字段筛选日志比grep文本文件快10倍以上存储压缩比高MySQL的压缩存储可比原始日志节省60%空间可视化友好结构化数据可直接对接Grafana等可视化工具推荐的基础环境配置组件最低配置生产环境建议配置服务器2核CPU/4GB内存/100GB存储4核CPU/16GB内存/500GB SSDMySQL5.7版本8.0版本InnoDB集群rsyslogv8.24v8.32提示对于日志量超过50GB/天的场景建议考虑MySQL分表策略或改用Elasticsearch作为存储后端2. RouterOS日志输出配置精要RouterOS的日志系统采用topic分类机制我们需要精准控制哪些日志需要上报。以下是经过实战验证的最佳配置组合/system logging action add remote192.168.1.100:514 src-address192.168.1.1 \ targetremote topicscript,firewall,info prefix[ROUTER-A] /system logging add actionremote topicsscript,firewall关键参数解析prefix建议添加设备标识便于后续区分日志来源src-address在服务器端做IP白名单过滤topic根据实际需求选择常用组合包括防火墙日志firewall脚本日志script系统事件system,info实测网络延迟对日志传输的影响网络延迟日志丢失率(UDP)日志丢失率(TCP)50ms0.1%0%50-100ms0.8%0%100ms3.2%0%重要对关键业务日志建议启用TCP传输虽然会增加5-10%的CPU负载但能确保日志完整性3. rsyslog服务器深度配置CentOS 7.6默认的rsyslog版本(8.24)已支持mysql模块但需要针对性优化配置。以下是经过百万级日志量验证的配置模板# 安装必要组件 yum install -y rsyslog rsyslog-mysql mariadb-server/etc/rsyslog.conf关键配置段# 增强UDP接收缓冲区(默认8KB容易丢包) $UDPServerAddress 0.0.0.0 $UDPServerRun 514 $UDPServerSocketBufferSize 256000 # MySQL连接池配置 $ModLoad ommysql $ActionOmMySQLServerPort 3306 $ActionOmMySQLConnRetryCount 3 $ActionOmMySQLConnRetryInterval 30 # 日志模板(适配RouterOS字段) template(nameRouterOSTpl typelist option.sqlon) { constant(value() property(nametimereported dateFormatmysql) constant(value,) property(namehostname) constant(value,) property(namesyslogtag) constant(value,) property(namemsg) constant(value,) property(namefromhost-ip) constant(value)) } # 路由规则 if $fromhost-ip startswith 192.168.1. then { action(typeommysql server127.0.0.1 dbSyslog uidloguser pwd123456 templateRouterOSTpl) }性能调优参数对比参数默认值优化值效果$UDPServerSocketBufferSize8KB256KB丢包率从1.2%降至0.01%$ActionQueueSize10,00050,000峰值处理能力提升40%$ActionQueueTypeDirectLinkedList内存占用减少30%4. MySQL数据库优化策略使用官方提供的createDB.sql初始化数据库后还需要针对日志特点进行优化-- 分区表方案(按天分区) ALTER TABLE SystemEvents PARTITION BY RANGE (TO_DAYS(ReceivedAt)) ( PARTITION p202301 VALUES LESS THAN (TO_DAYS(2023-02-01)), PARTITION p202302 VALUES LESS THAN (TO_DAYS(2023-03-01)), PARTITION pmax VALUES LESS THAN MAXVALUE ); -- 添加设备IP索引 CREATE INDEX idx_fromhost ON SystemEvents (FromHost); -- 优化InnoDB参数 SET GLOBAL innodb_buffer_pool_size4G; SET GLOBAL innodb_flush_log_at_trx_commit2;日志保留策略建议-- 自动清理30天前日志 CREATE EVENT purge_old_logs ON SCHEDULE EVERY 1 DAY DO DELETE FROM SystemEvents WHERE ReceivedAt DATE_SUB(NOW(), INTERVAL 30 DAY);5. 高级应用场景实现5.1 实时告警触发通过rsyslog的omprog模块对接Python脚本实现实时告警#!/usr/bin/python3 import sys import smtplib from email.mime.text import MIMEText while True: line sys.stdin.readline() if CRITICAL in line: msg MIMEText(line) msg[Subject] RouterOS告警 msg[From] alertsexample.com msg[To] adminexample.com s smtplib.SMTP(localhost) s.send_message(msg) s.quit()rsyslog配置对应规则module(loadomprog) if $msg contains CRITICAL then { action(typeomprog binary/usr/local/bin/log_alert.py) }5.2 可视化分析方案推荐使用GrafanaMySQL数据源的组合-- 创建视图便于分析 CREATE VIEW firewall_logs AS SELECT ReceivedAt as timestamp, FromHost as device, SUBSTRING_INDEX(Message, ,1) as action, COUNT(*) as count FROM SystemEvents WHERE Message LIKE %firewall% GROUP BY 1,2,3;典型监控指标每分钟阻断攻击数设备日志量TOP10脚本执行失败率6. 故障排查指南当遇到日志收集异常时按以下步骤排查基础连通性测试# 在RouterOS上测试端口连通性 /tool telnet 192.168.1.100 514 # 在服务器端抓包验证 tcpdump -i eth0 udp port 514 -vvrsyslog调试模式rsyslogd -dn | grep -i routerosMySQL日志分析SHOW PROCESSLIST; SELECT * FROM mysql.slow_log ORDER BY start_time DESC LIMIT 10;常见问题处理速查表现象可能原因解决方案日志延迟超过5分钟MySQL写入队列堆积增加$ActionQueueSize部分设备日志缺失UDP丢包改用TCP或调整缓冲区大小数据库连接频繁断开连接池耗尽设置$ActionOmMySQLConnRetry*这套系统在我们生产环境稳定运行两年日均处理80台RouterOS设备的230万条日志。最值得的投资是给每台设备添加了唯一前缀这在排查跨设备问题时节省了大量时间。