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

