Rsyslog + MySQL 實現(xiàn)日志集中存儲及常見問題排查
rsyslog-mysql 是 Linux 系統(tǒng)級日志解決方案,核心作用是:將 Linux 本機 / 遠程主機的系統(tǒng)日志、應用日志,通過 rsyslog 服務自動采集,并實時、批量寫入 MySQL/MariaDB 數(shù)據(jù)庫,實現(xiàn)日志的集中存儲、統(tǒng)一查詢、結構化管理,是企業(yè)級日志落地的主流方案,無需手寫代碼即可完成日志入庫。
一、環(huán)境前置要求
1.基礎環(huán)境清單
操作系統(tǒng):CentOS 7/8、Ubuntu 18.04+、Rocky Linux(均適配)
數(shù)據(jù)庫:MySQL 5.7+/8.0+ 或 MariaDB 10.2+(服務正常運行、可遠程 / 本地連接)
核心依賴:rsyslog(系統(tǒng)默認自帶,需升級至支持 mysql 模塊版本)、rsyslog-mysql(核心插件)、mysql-connector-odbc(數(shù)據(jù)庫驅(qū)動)
2.核心依賴安裝
CentOS/RHEL/Rocky Linux(yum 源)
# 1. 安裝rsyslog主程序+mysql插件+mysql驅(qū)動 yum install -y rsyslog rsyslog-mysql mariadb-connector-odbc # 2. 檢查rsyslog版本(需≥8.0,確保mysql模塊可用) rsyslogd -v
Ubuntu/Debian(apt 源)
# 1. 安裝依賴包 apt update && apt install -y rsyslog rsyslog-mysql mysql-connector-odbc # 2. 檢查版本 rsyslogd -v
二、MySQL 端配置(創(chuàng)建日志庫 + 表 + 授權用戶)
1.登錄 MySQL,創(chuàng)建日志專用數(shù)據(jù)庫
-- 登錄MySQL(本地/遠程均可) mysql -uroot -p你的數(shù)據(jù)庫密碼 -- 1. 創(chuàng)建日志庫(建議命名:syslogs,可自定義) CREATE DATABASE IF NOT EXISTS syslogs DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; USE syslogs;
2.導入官方日志表結構(核心!rsyslog-mysql 專用)
rsyslog-mysql 插件自帶標準化日志表結構,無需手動建表,直接執(zhí)行以下官方 SQL 即可,表結構適配所有 syslog 日志格式,包含日志所有核心字段:
-- 核心日志表:syslog(存儲所有采集的日志數(shù)據(jù),官方標準結構) 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采集的系統(tǒng)/應用日志表';
表字段說明(關鍵):
facility:日志設備類型(如 auth、kern、user、local0-local7)
priority:日志優(yōu)先級(如 info、warn、err、crit)
hostname:日志來源主機(本機 / 遠程服務器 IP / 主機名)
program:日志產(chǎn)生的程序名(如 sshd、nginx、java)
msg:日志正文內(nèi)容(核心字段)
timestamp:日志產(chǎn)生時間
3.創(chuàng)建 rsyslog 專用數(shù)據(jù)庫用戶(權限最小化)
嚴禁用 root 用戶連接,創(chuàng)建獨立用戶并僅授權「日志庫的增 / 查權限」,保證數(shù)據(jù)庫安全:
-- 創(chuàng)建用戶 rsyslog_user,允許本機連接(% 表示允許所有主機,生產(chǎn)可限制為rsyslog服務器IP) CREATE USER 'rsyslog_user'@'localhost' IDENTIFIED BY '你的強密碼'; -- 生產(chǎn)環(huán)境(遠程連接):CREATE USER 'rsyslog_user'@'192.168.1.100' IDENTIFIED BY '密碼'; -- 授權:僅允許對syslogs庫的syslog表執(zhí)行 插入/查詢 操作(最小權限) GRANT INSERT, SELECT ON syslogs.syslog TO 'rsyslog_user'@'localhost'; -- 刷新權限生效 FLUSH PRIVILEGES; -- 退出MySQL exit;
三、rsyslog 核心配置(關鍵!實現(xiàn)日志寫入 MySQL)
rsyslog 的核心配置文件為 /etc/rsyslog.conf,需完成「加載 mysql 模塊」+「配置日志入庫規(guī)則」兩步,配置后即可實現(xiàn)日志自動寫入 MySQL
1.編輯主配置文件/etc/rsyslog.conf
# 編輯配置文件(推薦vim,也可用nano) vim /etc/rsyslog.conf
2.開啟模塊加載(頂部添加,啟用 mysql 和 ommysql 模塊)
在配置文件最頂部添加以下內(nèi)容,加載 rsyslog 連接 MySQL 的核心模塊(必須開啟,否則無法入庫):
# 加載rsyslog核心模塊 $ModLoad imuxsock # 接收本機syslog日志 $ModLoad imjournal # 讀取systemd-journal日志 $ModLoad ommysql # 核心:啟用rsyslog寫入MySQL的模塊(重中之重) $ModLoad imtcp # 可選:啟用TCP模塊,接收遠程主機日志(端口514) $InputTCPServerRun 514 # 可選:開啟514端口,監(jiān)聽遠程日志請求
3.配置日志寫入 MySQL 的核心規(guī)則(文件末尾添加)
這是最核心的配置,定義「哪些日志」→「寫入哪個 MySQL 庫表」,直接復制以下內(nèi)容到配置文件末尾,替換為你的數(shù)據(jù)庫信息:
# ===================== Rsyslog -> MySQL 核心規(guī)則 ===================== # 格式說明::ommysql:數(shù)據(jù)庫地址,數(shù)據(jù)庫名,數(shù)據(jù)庫用戶,數(shù)據(jù)庫密碼,表名 # 日志過濾規(guī)則:*.* 表示采集【所有設備、所有優(yōu)先級】的日志(可自定義過濾) *.* :ommysql:127.0.0.1,syslogs,rsyslog_user,你的數(shù)據(jù)庫密碼,syslog;
關鍵參數(shù)說明(必須替換為你的實際信息)
127.0.0.1:MySQL 數(shù)據(jù)庫地址(本地填本機 IP,遠程填數(shù)據(jù)庫服務器 IP)
syslogs:第一步創(chuàng)建的日志數(shù)據(jù)庫名
rsyslog_user:第一步創(chuàng)建的數(shù)據(jù)庫專用用戶
你的數(shù)據(jù)庫密碼:rsyslog_user 對應的密碼(務必填寫正確)
syslog:第一步創(chuàng)建的日志表名
4.保存配置并檢查語法(必做,避免配置錯誤)
# 1. 保存vim配置:按 Esc → 輸入 :wq → 回車 # 2. 檢查rsyslog配置語法(核心!配置錯誤會導致服務啟動失?。? rsyslogd -N1 # 成功提示:rsyslogd: config validation run successful.
四、重啟服務 + 驗證日志入庫(快速驗證效果)
1.重啟 rsyslog 服務,使配置生效
# CentOS 7+/RHEL 7+/Rocky Linux systemctl restart rsyslog # 設置開機自啟(生產(chǎn)必備) systemctl enable rsyslog # Ubuntu/Debian service rsyslog restart update-rc.d rsyslog defaults
2.檢查 rsyslog 服務狀態(tài)(確保正常運行)
# 檢查服務狀態(tài) systemctl status rsyslog
3.快速驗證:生成測試日志,檢查 MySQL 是否入庫
本機生成一條測試日志
# 用logger命令手動生成一條測試日志(會被rsyslog采集) logger "rsyslog-mysql test log: 2025-12-28 success"
登錄 MySQL,驗證日志是否寫入
# 登錄MySQL mysql -ursyslog_user -p你的密碼 # 查看日志表數(shù)據(jù) USE syslogs; SELECT * FROM syslog ORDER BY id DESC LIMIT 1;
五、高級配置(生產(chǎn)必備,性能 + 功能優(yōu)化)
1.性能優(yōu)化:開啟日志批量寫入(提升入庫效率)
rsyslog 默認單條寫入 MySQL,高日志量場景下開啟批量寫入,可大幅降低數(shù)據(jù)庫 IO 壓力,提升入庫性能,修改 /etc/rsyslog.conf 添加以下配置:
# 批量寫入配置(添加到mysql規(guī)則上方) $OMMySQLBatchSize 100 # 累計100條日志批量寫入一次 $OMMySQLFlushInterval 500 # 超時500ms,即使未到100條也強制寫入
2.功能擴展:接收遠程服務器日志(集中化管理)
rsyslog 支持作為日志服務端,接收所有遠程 Linux 主機的日志,實現(xiàn)「一臺服務器集中存儲所有主機日志」,配置如下:
服務端(已配置 rsyslog-mysql 的服務器):確保開啟 TCP 模塊
# 已在第二步配置,確認存在即可 $ModLoad imtcp $InputTCPServerRun 514
客戶端(其他需要推送日志的服務器):修改本機 rsyslog 配置
# 編輯客戶端rsyslog.conf vim /etc/rsyslog.conf # 末尾添加:將本機日志推送到服務端IP(替換為你的rsyslog服務端IP) *.* @192.168.1.100:514;RSYSLOG_SyslogProtocol23Format # 重啟客戶端rsyslog systemctl restart rsyslog
3.日志切割 + 清理(解決日志表數(shù)據(jù)膨脹,生產(chǎn)必做)
rsyslog 入庫的日志會持續(xù)累加,需定期清理歷史日志,推薦 2 種方案:
方案 1:MySQL 分區(qū)表(推薦,秒級清理)
給 syslog 表按時間分區(qū)(按天 / 月),清理歷史日志時直接刪除分區(qū),無性能損耗:
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
);
# 刪除歷史分區(qū)(秒級)
ALTER TABLE syslogs.syslog DROP PARTITION p20251228;方案 2:定時任務清理(簡單易用)
用 Linux Crontab 創(chuàng)建定時任務,每天凌晨刪除 7 天前的日志:
# 編輯定時任務 crontab -e # 添加以下內(nèi)容(每天2點執(zhí)行,刪除7天前的日志) 0 2 * * * mysql -ursyslog_user -p密碼 -e "USE syslogs; DELETE FROM syslog WHERE timestamp < DATE_SUB(NOW(), INTERVAL 7 DAY);"
六、常見問題排查(避坑指南,99% 的問題都在這)
問題 1:rsyslog 服務啟動失敗
# 排查方法1:查看服務啟動日志(核心) journalctl -u rsyslog -f # 排查方法2:檢查配置語法 rsyslogd -N1 # 常見原因: 1. 未加載ommysql模塊 → 補充 $ModLoad ommysql 2. 數(shù)據(jù)庫密碼錯誤 → 核對rsyslog.conf中的密碼 3. selinux攔截 → 臨時關閉:setenforce 0
問題 2:rsyslog 服務運行正常,但 MySQL 無日志入庫
# 排查步驟: 1. 檢查數(shù)據(jù)庫用戶權限 → 重新執(zhí)行授權SQL 2. 檢查rsyslog日志規(guī)則 → 確認 *.* :ommysql:... 配置正確 3. 關閉selinux防火墻(生產(chǎn)可配置白名單): setenforce 0 sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config 4. 檢查MySQL連接 → 用rsyslog_user登錄MySQL,測試插入數(shù)據(jù)
問題 3:日志入庫速度慢 / 丟失日志
# 優(yōu)化方案: 1. 開啟批量寫入(配置 $OMMySQLBatchSize 100) 2. 關閉rsyslog同步刷盤:在rsyslog.conf添加 $ActionQueueType LinkedList $ActionQueueFileName rsyslog-mysql $ActionResumeRetryCount -1 3. 調(diào)優(yōu)MySQL:innodb_flush_log_at_trx_commit = 2
到此這篇關于Rsyslog + MySQL 實現(xiàn)日志集中存儲的文章就介紹到這了,更多相關rsyslog mysql日志集中存儲內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
防止服務器宕機時MySQL數(shù)據(jù)丟失的幾種方案
這篇文章主要介紹了防止服務器宕機時MySQL數(shù)據(jù)丟失的幾種方案,結合實踐介紹了Replication和Monitor以及Failover這三個項目的應用,需要的朋友可以參考下2015-06-06
MySQL 數(shù)據(jù)庫常用命令 簡單超級實用版
MySQL 數(shù)據(jù)庫常用命令,都是一些比較基礎的東西,更多的命令可以查看相關文章里面的文字。2010-07-07
MySQL性能優(yōu)化之索引優(yōu)化與查詢優(yōu)化
在數(shù)據(jù)庫優(yōu)化中,索引優(yōu)化和查詢優(yōu)化是兩個非常重要的方面,通過合理地使用索引,可以顯著提高查詢效率,這篇文章主要介紹了MySQL性能優(yōu)化之索引優(yōu)化與查詢優(yōu)化的相關資料,需要的朋友可以參考下2025-12-12
MySQL學習(七):Innodb存儲引擎索引的實現(xiàn)原理詳解
這篇文章主要介紹了Innodb存儲引擎索引的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-04-04

