Rsyslog + MySQL 实现日志集中存储

目录

一、环境前置要求

1.基础环境清单

2.核心依赖安装

[二、MySQL 端配置(创建日志库 + 表 + 授权用户)](#二、MySQL 端配置(创建日志库 + 表 + 授权用户))

[1.登录 MySQL,创建日志专用数据库](#1.登录 MySQL,创建日志专用数据库)

[2.导入官方日志表结构(核心!rsyslog-mysql 专用)](#2.导入官方日志表结构(核心!rsyslog-mysql 专用))

[3.创建 rsyslog 专用数据库用户(权限最小化)](#3.创建 rsyslog 专用数据库用户(权限最小化))

[三、rsyslog 核心配置(关键!实现日志写入 MySQL)](#三、rsyslog 核心配置(关键!实现日志写入 MySQL))

[1.编辑主配置文件 /etc/rsyslog.conf](#1.编辑主配置文件 /etc/rsyslog.conf)

[2.开启模块加载(顶部添加,启用 mysql 和 ommysql 模块)](#2.开启模块加载(顶部添加,启用 mysql 和 ommysql 模块))

[3.配置日志写入 MySQL 的核心规则(文件末尾添加)](#3.配置日志写入 MySQL 的核心规则(文件末尾添加))

4.保存配置并检查语法(必做,避免配置错误)

[四、重启服务 + 验证日志入库(快速验证效果)](#四、重启服务 + 验证日志入库(快速验证效果))

[1.重启 rsyslog 服务,使配置生效](#1.重启 rsyslog 服务,使配置生效)

[2.检查 rsyslog 服务状态(确保正常运行)](#2.检查 rsyslog 服务状态(确保正常运行))

[3.快速验证:生成测试日志,检查 MySQL 是否入库](#3.快速验证:生成测试日志,检查 MySQL 是否入库)

[五、高级配置(生产必备,性能 + 功能优化)](#五、高级配置(生产必备,性能 + 功能优化))

1.性能优化:开启日志批量写入(提升入库效率)

2.功能扩展:接收远程服务器日志(集中化管理)

[3.日志切割 + 清理(解决日志表数据膨胀,生产必做)](#3.日志切割 + 清理(解决日志表数据膨胀,生产必做))

[六、常见问题排查(避坑指南,99% 的问题都在这)](#六、常见问题排查(避坑指南,99% 的问题都在这))

[问题 1:rsyslog 服务启动失败](#问题 1:rsyslog 服务启动失败)

[问题 2:rsyslog 服务运行正常,但 MySQL 无日志入库](#问题 2:rsyslog 服务运行正常,但 MySQL 无日志入库)

[问题 3:日志入库速度慢 / 丢失日志](#问题 3:日志入库速度慢 / 丢失日志)


rsyslog-mysql 是 Linux 系统级日志解决方案,核心作用是:将 Linux 本机 / 远程主机的系统日志、应用日志,通过 rsyslog 服务自动采集,并实时、批量写入 MySQL/MariaDB 数据库,实现日志的集中存储、统一查询、结构化管理,是企业级日志落地的主流方案,无需手写代码即可完成日志入库。

一、环境前置要求

1.基础环境清单

操作系统:CentOS 7/8、Ubuntu 18.04+、Rocky Linux(均适配)

数据库:MySQL 5.7+/8.0+ 或 MariaDB 10.2+(服务正常运行、可远程 / 本地连接)

核心依赖:rsyslog(系统默认自带,需升级至支持 mysql 模块版本)、rsyslog-mysql(核心插件)、mysql-connector-odbc(数据库驱动)

2.核心依赖安装

CentOS/RHEL/Rocky Linux(yum 源)

bash 复制代码
# 1. 安装rsyslog主程序+mysql插件+mysql驱动
yum install -y rsyslog rsyslog-mysql mariadb-connector-odbc
# 2. 检查rsyslog版本(需≥8.0,确保mysql模块可用)
rsyslogd -v

Ubuntu/Debian(apt 源)

bash 复制代码
# 1. 安装依赖包
apt update && apt install -y rsyslog rsyslog-mysql mysql-connector-odbc
# 2. 检查版本
rsyslogd -v

二、MySQL 端配置(创建日志库 + 表 + 授权用户)

1.登录 MySQL,创建日志专用数据库

bash 复制代码
-- 登录MySQL(本地/远程均可)
mysql -uroot -p你的数据库密码

-- 1. 创建日志库(建议命名:syslogs,可自定义)
CREATE DATABASE IF NOT EXISTS syslogs DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
USE syslogs;

2.导入官方日志表结构(核心!rsyslog-mysql 专用)

rsyslog-mysql 插件自带标准化日志表结构,无需手动建表,直接执行以下官方 SQL 即可,表结构适配所有 syslog 日志格式,包含日志所有核心字段:

bash 复制代码
-- 核心日志表:syslog(存储所有采集的日志数据,官方标准结构)
CREATE TABLE IF NOT EXISTS syslog (
  id INT UNSIGNED NOT NULL AUTO_INCREMENT,
  facility VARCHAR(10) NOT NULL,
  priority VARCHAR(10) NOT NULL,
  severity INT NOT NULL,
  hostname VARCHAR(64) NOT NULL,
  timestamp DATETIME NOT NULL,
  program VARCHAR(64) NOT NULL,
  msg TEXT NOT NULL,
  tag VARCHAR(32) DEFAULT NULL,
  PRIMARY KEY (id),
  INDEX idx_timestamp (timestamp),
  INDEX idx_hostname (hostname),
  INDEX idx_program (program)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='rsyslog采集的系统/应用日志表';

表字段说明(关键)

facility:日志设备类型(如 auth、kern、user、local0-local7)

priority:日志优先级(如 info、warn、err、crit)

hostname:日志来源主机(本机 / 远程服务器 IP / 主机名)

program:日志产生的程序名(如 sshd、nginx、java)

msg:日志正文内容(核心字段)

timestamp:日志产生时间

3.创建 rsyslog 专用数据库用户(权限最小化)

严禁用 root 用户连接,创建独立用户并仅授权「日志库的增 / 查权限」,保证数据库安全:

bash 复制代码
-- 创建用户 rsyslog_user,允许本机连接(% 表示允许所有主机,生产可限制为rsyslog服务器IP)
CREATE USER 'rsyslog_user'@'localhost' IDENTIFIED BY '你的强密码';
-- 生产环境(远程连接):CREATE USER 'rsyslog_user'@'192.168.1.100' IDENTIFIED BY '密码';

-- 授权:仅允许对syslogs库的syslog表执行 插入/查询 操作(最小权限)
GRANT INSERT, SELECT ON syslogs.syslog TO 'rsyslog_user'@'localhost';

-- 刷新权限生效
FLUSH PRIVILEGES;

-- 退出MySQL
exit;

三、rsyslog 核心配置(关键!实现日志写入 MySQL)

rsyslog 的核心配置文件为 /etc/rsyslog.conf,需完成「加载 mysql 模块」+「配置日志入库规则」两步,配置后即可实现日志自动写入 MySQL

1.编辑主配置文件 /etc/rsyslog.conf

bash 复制代码
# 编辑配置文件(推荐vim,也可用nano)
vim /etc/rsyslog.conf

2.开启模块加载(顶部添加,启用 mysql 和 ommysql 模块)

在配置文件最顶部添加以下内容,加载 rsyslog 连接 MySQL 的核心模块(必须开启,否则无法入库):

bash 复制代码
# 加载rsyslog核心模块
$ModLoad imuxsock    # 接收本机syslog日志
$ModLoad imjournal   # 读取systemd-journal日志
$ModLoad ommysql     # 核心:启用rsyslog写入MySQL的模块(重中之重)
$ModLoad imtcp       # 可选:启用TCP模块,接收远程主机日志(端口514)
$InputTCPServerRun 514 # 可选:开启514端口,监听远程日志请求

3.配置日志写入 MySQL 的核心规则(文件末尾添加)

这是最核心的配置,定义「哪些日志 」→「写入哪个 MySQL 库表 」,直接复制以下内容到配置文件末尾,替换为你的数据库信息

bash 复制代码
# ===================== Rsyslog -> MySQL 核心规则 =====================
# 格式说明::ommysql:数据库地址,数据库名,数据库用户,数据库密码,表名
# 日志过滤规则:*.*  表示采集【所有设备、所有优先级】的日志(可自定义过滤)
*.*  :ommysql:127.0.0.1,syslogs,rsyslog_user,你的数据库密码,syslog;

关键参数说明 (必须替换为你的实际信息)

127.0.0.1:MySQL 数据库地址(本地填本机 IP,远程填数据库服务器 IP)

syslogs:第一步创建的日志数据库名

rsyslog_user:第一步创建的数据库专用用户

你的数据库密码:rsyslog_user 对应的密码(务必填写正确)

syslog:第一步创建的日志表名

4.保存配置并检查语法(必做,避免配置错误)

bash 复制代码
# 1. 保存vim配置:按 Esc → 输入 :wq → 回车

# 2. 检查rsyslog配置语法(核心!配置错误会导致服务启动失败)
rsyslogd -N1

# 成功提示:rsyslogd: config validation run successful.

四、重启服务 + 验证日志入库(快速验证效果)

1.重启 rsyslog 服务,使配置生效

bash 复制代码
# CentOS 7+/RHEL 7+/Rocky Linux
systemctl restart rsyslog
# 设置开机自启(生产必备)
systemctl enable rsyslog

# Ubuntu/Debian
service rsyslog restart
update-rc.d rsyslog defaults

2.检查 rsyslog 服务状态(确保正常运行)

bash 复制代码
# 检查服务状态
systemctl status rsyslog

3.快速验证:生成测试日志,检查 MySQL 是否入库

本机生成一条测试日志

bash 复制代码
# 用logger命令手动生成一条测试日志(会被rsyslog采集)
logger "rsyslog-mysql test log: 2025-12-28 success"

登录 MySQL,验证日志是否写入

bash 复制代码
# 登录MySQL
mysql -ursyslog_user -p你的密码

# 查看日志表数据
USE syslogs;
SELECT * FROM syslog ORDER BY id DESC LIMIT 1;

五、高级配置(生产必备,性能 + 功能优化)

1.性能优化:开启日志批量写入(提升入库效率)

rsyslog 默认单条写入 MySQL,高日志量场景下开启批量写入 ,可大幅降低数据库 IO 压力,提升入库性能,修改 /etc/rsyslog.conf 添加以下配置:

bash 复制代码
# 批量写入配置(添加到mysql规则上方)
$OMMySQLBatchSize 100    # 累计100条日志批量写入一次
$OMMySQLFlushInterval 500 # 超时500ms,即使未到100条也强制写入

2.功能扩展:接收远程服务器日志(集中化管理)

rsyslog 支持作为日志服务端 ,接收所有远程 Linux 主机的日志,实现「一台服务器集中存储所有主机日志」,配置如下:

服务端(已配置 rsyslog-mysql 的服务器):确保开启 TCP 模块

bash 复制代码
# 已在第二步配置,确认存在即可
$ModLoad imtcp
$InputTCPServerRun 514

客户端(其他需要推送日志的服务器):修改本机 rsyslog 配置

bash 复制代码
# 编辑客户端rsyslog.conf
vim /etc/rsyslog.conf

# 末尾添加:将本机日志推送到服务端IP(替换为你的rsyslog服务端IP)
*.* @192.168.1.100:514;RSYSLOG_SyslogProtocol23Format

# 重启客户端rsyslog
systemctl restart rsyslog

3.日志切割 + 清理(解决日志表数据膨胀,生产必做)

rsyslog 入库的日志会持续累加,需定期清理历史日志,推荐 2 种方案:

方案 1:MySQL 分区表(推荐,秒级清理)

给 syslog 表按时间分区(按天 / 月),清理历史日志时直接删除分区,无性能损耗:

bash 复制代码
ALTER TABLE syslogs.syslog 
PARTITION BY RANGE (TO_DAYS(timestamp)) (
    PARTITION p20251228 VALUES LESS THAN (TO_DAYS('2025-12-29')),
    PARTITION p20251229 VALUES LESS THAN (TO_DAYS('2025-12-30')),
    PARTITION p_future VALUES LESS THAN MAXVALUE
);
# 删除历史分区(秒级)
ALTER TABLE syslogs.syslog DROP PARTITION p20251228;

方案 2:定时任务清理(简单易用)

用 Linux Crontab 创建定时任务,每天凌晨删除 7 天前的日志:

bash 复制代码
# 编辑定时任务
crontab -e
# 添加以下内容(每天2点执行,删除7天前的日志)
0 2 * * * mysql -ursyslog_user -p密码 -e "USE syslogs; DELETE FROM syslog WHERE timestamp < DATE_SUB(NOW(), INTERVAL 7 DAY);"

六、常见问题排查(避坑指南,99% 的问题都在这)

问题 1:rsyslog 服务启动失败

bash 复制代码
# 排查方法1:查看服务启动日志(核心)
journalctl -u rsyslog -f

# 排查方法2:检查配置语法
rsyslogd -N1

# 常见原因:
1. 未加载ommysql模块 → 补充 $ModLoad ommysql
2. 数据库密码错误 → 核对rsyslog.conf中的密码
3. selinux拦截 → 临时关闭:setenforce 0

问题 2:rsyslog 服务运行正常,但 MySQL 无日志入库

bash 复制代码
# 排查步骤:
1. 检查数据库用户权限 → 重新执行授权SQL
2. 检查rsyslog日志规则 → 确认 *.* :ommysql:... 配置正确
3. 关闭selinux防火墙(生产可配置白名单):
   setenforce 0
   sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
4. 检查MySQL连接 → 用rsyslog_user登录MySQL,测试插入数据

问题 3:日志入库速度慢 / 丢失日志

bash 复制代码
# 优化方案:
1. 开启批量写入(配置 $OMMySQLBatchSize 100)
2. 关闭rsyslog同步刷盘:在rsyslog.conf添加
   $ActionQueueType LinkedList
   $ActionQueueFileName rsyslog-mysql
   $ActionResumeRetryCount -1
3. 调优MySQL:innodb_flush_log_at_trx_commit = 2
相关推荐
程序猿20232 小时前
SQL-性能优化
数据库·sql·性能优化
Token_w2 小时前
Llama 3-8B-Instruct 在昇腾 NPU 上的 SGLang 性能实测
mysql·llama·sglang
程序员王天2 小时前
SQLite 查询优化实战:从9秒到300毫秒
数据库·electron·sqlite
码农水水2 小时前
宇树科技Java被问:数据库连接池的工作原理
java·数据库·后端·oracle
yangmf20402 小时前
INFINI Gateway 助力联想集团 ES 迁移升级
大数据·数据库·elasticsearch·搜索引擎·gateway·全文检索
better_liang2 小时前
每日Java面试场景题知识点之-MySQL高并发数据一致性保障
mysql·高并发·java面试·数据一致性·企业级开发
码农阿豪2 小时前
MySQL 亿级大表(1.35亿条)安全添加字段实战指南
数据库·mysql·安全
典龙3302 小时前
推荐一款开源免费的AI智能数据库工具,支持连接mysql,oracle,postgresql,ssh,redis
数据库·mysql
怎么没有名字注册了啊2 小时前
VMware 完整版安装 Debian 纯命令行系统(无图形化、超详细全程教程)
linux·服务器·网络·数据库·debian