Rsyslog + MySQL 實(shí)現(xiàn)日志集中存儲(chǔ)及常見(jiàn)問(wèn)題排查
rsyslog-mysql 是 Linux 系統(tǒng)級(jí)日志解決方案,核心作用是:將 Linux 本機(jī) / 遠(yuǎn)程主機(jī)的系統(tǒng)日志、應(yīng)用日志,通過(guò) rsyslog 服務(wù)自動(dòng)采集,并實(shí)時(shí)、批量寫(xiě)入 MySQL/MariaDB 數(shù)據(jù)庫(kù),實(shí)現(xiàn)日志的集中存儲(chǔ)、統(tǒng)一查詢、結(jié)構(gòu)化管理,是企業(yè)級(jí)日志落地的主流方案,無(wú)需手寫(xiě)代碼即可完成日志入庫(kù)。
一、環(huán)境前置要求
1.基礎(chǔ)環(huán)境清單
操作系統(tǒng):CentOS 7/8、Ubuntu 18.04+、Rocky Linux(均適配)
數(shù)據(jù)庫(kù):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ù)庫(kù)驅(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)建日志庫(kù) + 表 + 授權(quán)用戶)
1.登錄 MySQL,創(chuàng)建日志專用數(shù)據(jù)庫(kù)
-- 登錄MySQL(本地/遠(yuǎn)程均可) mysql -uroot -p你的數(shù)據(jù)庫(kù)密碼 -- 1. 創(chuàng)建日志庫(kù)(建議命名: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),無(wú)需手動(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)用日志表';
表字段說(shuō)明(關(guān)鍵):
facility:日志設(shè)備類型(如 auth、kern、user、local0-local7)
priority:日志優(yōu)先級(jí)(如 info、warn、err、crit)
hostname:日志來(lái)源主機(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ù)庫(kù)用戶(權(quán)限最小化)
嚴(yán)禁用 root 用戶連接,創(chuàng)建獨(dú)立用戶并僅授權(quán)「日志庫(kù)的增 / 查權(quán)限」,保證數(shù)據(jù)庫(kù)安全:
-- 創(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庫(kù)的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)日志寫(xiě)入 MySQL)
rsyslog 的核心配置文件為 /etc/rsyslog.conf,需完成「加載 mysql 模塊」+「配置日志入庫(kù)規(guī)則」兩步,配置后即可實(shí)現(xiàn)日志自動(dòng)寫(xiě)入 MySQL
1.編輯主配置文件/etc/rsyslog.conf
# 編輯配置文件(推薦vim,也可用nano) vim /etc/rsyslog.conf
2.開(kāi)啟模塊加載(頂部添加,啟用 mysql 和 ommysql 模塊)
在配置文件最頂部添加以下內(nèi)容,加載 rsyslog 連接 MySQL 的核心模塊(必須開(kāi)啟,否則無(wú)法入庫(kù)):
# 加載rsyslog核心模塊 $ModLoad imuxsock # 接收本機(jī)syslog日志 $ModLoad imjournal # 讀取systemd-journal日志 $ModLoad ommysql # 核心:?jiǎn)⒂胷syslog寫(xiě)入MySQL的模塊(重中之重) $ModLoad imtcp # 可選:?jiǎn)⒂肨CP模塊,接收遠(yuǎn)程主機(jī)日志(端口514) $InputTCPServerRun 514 # 可選:開(kāi)啟514端口,監(jiān)聽(tīng)遠(yuǎn)程日志請(qǐng)求
3.配置日志寫(xiě)入 MySQL 的核心規(guī)則(文件末尾添加)
這是最核心的配置,定義「哪些日志」→「寫(xiě)入哪個(gè) MySQL 庫(kù)表」,直接復(fù)制以下內(nèi)容到配置文件末尾,替換為你的數(shù)據(jù)庫(kù)信息:
# ===================== Rsyslog -> MySQL 核心規(guī)則 ===================== # 格式說(shuō)明::ommysql:數(shù)據(jù)庫(kù)地址,數(shù)據(jù)庫(kù)名,數(shù)據(jù)庫(kù)用戶,數(shù)據(jù)庫(kù)密碼,表名 # 日志過(guò)濾規(guī)則:*.* 表示采集【所有設(shè)備、所有優(yōu)先級(jí)】的日志(可自定義過(guò)濾) *.* :ommysql:127.0.0.1,syslogs,rsyslog_user,你的數(shù)據(jù)庫(kù)密碼,syslog;
關(guān)鍵參數(shù)說(shuō)明(必須替換為你的實(shí)際信息)
127.0.0.1:MySQL 數(shù)據(jù)庫(kù)地址(本地填本機(jī) IP,遠(yuǎn)程填數(shù)據(jù)庫(kù)服務(wù)器 IP)
syslogs:第一步創(chuàng)建的日志數(shù)據(jù)庫(kù)名
rsyslog_user:第一步創(chuàng)建的數(shù)據(jù)庫(kù)專用用戶
你的數(shù)據(jù)庫(kù)密碼:rsyslog_user 對(duì)應(yīng)的密碼(務(wù)必填寫(xiě)正確)
syslog:第一步創(chuàng)建的日志表名
4.保存配置并檢查語(yǔ)法(必做,避免配置錯(cuò)誤)
# 1. 保存vim配置:按 Esc → 輸入 :wq → 回車 # 2. 檢查rsyslog配置語(yǔ)法(核心!配置錯(cuò)誤會(huì)導(dǎo)致服務(wù)啟動(dòng)失?。? rsyslogd -N1 # 成功提示:rsyslogd: config validation run successful.
四、重啟服務(wù) + 驗(yàn)證日志入庫(kù)(快速驗(yàn)證效果)
1.重啟 rsyslog 服務(wù),使配置生效
# CentOS 7+/RHEL 7+/Rocky Linux systemctl restart rsyslog # 設(shè)置開(kāi)機(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 是否入庫(kù)
本機(jī)生成一條測(cè)試日志
# 用logger命令手動(dòng)生成一條測(cè)試日志(會(huì)被rsyslog采集) logger "rsyslog-mysql test log: 2025-12-28 success"
登錄 MySQL,驗(yàn)證日志是否寫(xiě)入
# 登錄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)化:開(kāi)啟日志批量寫(xiě)入(提升入庫(kù)效率)
rsyslog 默認(rèn)單條寫(xiě)入 MySQL,高日志量場(chǎng)景下開(kāi)啟批量寫(xiě)入,可大幅降低數(shù)據(jù)庫(kù) IO 壓力,提升入庫(kù)性能,修改 /etc/rsyslog.conf 添加以下配置:
# 批量寫(xiě)入配置(添加到mysql規(guī)則上方) $OMMySQLBatchSize 100 # 累計(jì)100條日志批量寫(xiě)入一次 $OMMySQLFlushInterval 500 # 超時(shí)500ms,即使未到100條也強(qiáng)制寫(xiě)入
2.功能擴(kuò)展:接收遠(yuǎn)程服務(wù)器日志(集中化管理)
rsyslog 支持作為日志服務(wù)端,接收所有遠(yuǎn)程 Linux 主機(jī)的日志,實(shí)現(xiàn)「一臺(tái)服務(wù)器集中存儲(chǔ)所有主機(jī)日志」,配置如下:
服務(wù)端(已配置 rsyslog-mysql 的服務(wù)器):確保開(kāi)啟 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 入庫(kù)的日志會(huì)持續(xù)累加,需定期清理歷史日志,推薦 2 種方案:
方案 1:MySQL 分區(qū)表(推薦,秒級(jí)清理)
給 syslog 表按時(shí)間分區(qū)(按天 / 月),清理歷史日志時(shí)直接刪除分區(qū),無(wú)性能損耗:
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);"
六、常見(jiàn)問(wèn)題排查(避坑指南,99% 的問(wèn)題都在這)
問(wèn)題 1:rsyslog 服務(wù)啟動(dòng)失敗
# 排查方法1:查看服務(wù)啟動(dòng)日志(核心) journalctl -u rsyslog -f # 排查方法2:檢查配置語(yǔ)法 rsyslogd -N1 # 常見(jiàn)原因: 1. 未加載ommysql模塊 → 補(bǔ)充 $ModLoad ommysql 2. 數(shù)據(jù)庫(kù)密碼錯(cuò)誤 → 核對(duì)rsyslog.conf中的密碼 3. selinux攔截 → 臨時(shí)關(guān)閉:setenforce 0
問(wèn)題 2:rsyslog 服務(wù)運(yùn)行正常,但 MySQL 無(wú)日志入庫(kù)
# 排查步驟: 1. 檢查數(shù)據(jù)庫(kù)用戶權(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ù)
問(wèn)題 3:日志入庫(kù)速度慢 / 丟失日志
# 優(yōu)化方案: 1. 開(kāi)啟批量寫(xiě)入(配置 $OMMySQLBatchSize 100) 2. 關(guān)閉rsyslog同步刷盤(pán):在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編寫(xiě)動(dòng)態(tài)SQL實(shí)例
這篇文章主要介紹了MyBatis編寫(xiě)動(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ù)庫(kù)、啟動(dòng)和修改密碼等過(guò)程,同時(shí),還解決了客戶端不支持問(wèn)題以及配置遠(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ī)的解決方法
通常來(lái)說(shuō),我們看到的慢查詢一般還不致于導(dǎo)致掛站,頂多就是應(yīng)用響應(yīng)變慢不過(guò)這個(gè)恰好今天被我撞見(jiàn)了,一個(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

