关键在于模块加载、连接健壮性、队列缓冲、表结构适配和错误兜底五环节协同:启用ommysql的TCP+TLS模式,配置磁盘队列与永久重试,使用官方createDB.sql建表并添加查询索引,最后通过语法检查、压测和故障注入闭环验证。

要让 rsyslog 的 ommysql 模块在企业级场景下高并发、无损地把日志写入 MySQL(或 MariaDB),关键不在“装上就完事”,而在于模块加载、连接健壮性、队列缓冲、表结构适配和错误兜底这五个环节的协同。配置本身不复杂,但漏掉任一环都可能导致日志丢失、服务卡顿或数据库写满。
确保 ommysql 模块正确加载并启用 TCP+TLS(非 UDP)
UDP 无连接、不可靠,企业环境必须禁用;TCP 才能保证顺序与重传,配合 TLS 更可防中间人窃听日志内容(尤其含认证字段时)。
- 在
/etc/rsyslog.d/00-global.conf或主配置开头显式加载模块:module(load="ommysql" mode="tcp" tls="on") - 确认模块已就位:
ls /usr/lib64/rsyslog/ommysql.so(CentOS/RHEL)或ls /usr/lib/rsyslog/ommysql.so(Debian/Ubuntu) - 检查是否支持 TLS:
rsyslogd -N1 | grep -i tls,若无输出需重装带 GNUTLS 支持的 rsyslog 包(如rsyslog-gnutls)
配置可靠传输队列,避免高并发压垮 MySQL
默认直连写入在突发日志洪峰(如批量重启、安全扫描触发大量 auth 日志)时极易超时丢弃。必须启用磁盘队列 + 异步提交。
- 在
/etc/rsyslog.d/10-inputs.conf中定义带队列的动作:
action(type="ommysql"<br> server="192.168.10.5"<br> serverport="3306"<br> dbname="syslogs"<br> user="rsyslog_writer"<br> password="StrongPass@2026"<br> template="RSYSLOG_SyslogProtocol23Format"<br> queue.type="Disk"<br> queue.filename="ommysql_queue"<br> queue.maxdiskspace="2g"<br> queue.saveonshutdown="on"<br> queue.size="100000"<br> action.resumeRetryCount="-1"<br> action.reportSuspension="on"<br>)
-
queue.type="Disk"是核心:内存队列(queue.type="LinkedList")在崩溃或重启时会清空,磁盘队列才真正“无损” -
action.resumeRetryCount="-1"表示永久重试(直到 MySQL 恢复),而非默认的 100 次后丢弃 -
queue.maxdiskspace必须设上限,防止日志风暴占满磁盘(建议结合 logrotate 清理)
使用官方初始化表结构并添加关键索引
直接手建简单四字段表(id/timestamp/hostname/message)无法支撑千万级日志查询。必须用 rsyslog-mysql 包自带的 createDB.sql,它已预设分区、压缩和索引策略。
- 定位脚本:
rpm -ql rsyslog-mysql | grep createDB.sql(RPM 系统)或dpkg -L rsyslog-mysql | grep createDB.sql(Deb 系统) - 导入前创建专用库与用户:
CREATE DATABASE syslogs CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;CREATE USER 'rsyslog_writer'@'%' IDENTIFIED BY 'StrongPass@2026';GRANT INSERT,SELECT ON syslogs.* TO 'rsyslog_writer'@'%'; FLUSH PRIVILEGES; - 执行初始化:
mysql -u root -p syslogs < /usr/share/doc/rsyslog-mysql/createDB.sql - 手动追加高频查询字段索引(提升按时间/主机/IP筛选速度):
ALTER TABLE SystemEvents ADD INDEX idx_time_host (received_at, hostname);ALTER TABLE SystemEvents ADD INDEX idx_fromhost (fromhost_ip);
校验与持续监控:三步闭环验证
上线后不能只看“服务启动成功”,要验证真实路径是否通、压力下是否稳、异常时是否报。
-
语法与模块检查:
rsyslogd -N1(语法)、rsyslogd -M | grep ommysql(模块加载)、ss -tlnp | grep :514(端口监听) -
连通性压测:
用logger "test-$(date +%s)"发送单条;再用脚本循环 1000 次:for i in {1..1000}; do logger "burst-$i"; done,然后查 MySQL:mysql -e "SELECT COUNT(*) FROM SystemEvents WHERE message LIKE '%burst%';" syslogs—— 数值必须等于 1000 -
故障注入验证:
临时停 MySQL:systemctl stop mariadb,发 100 条日志,再启 MySQL,观察journalctl -u rsyslog -n 50是否出现resuming action...及最终全部写入

















