如何将数据库配置日志输出到syslog,让运维不再逐个查找日志文件?
摘要:作为运维或DBA,谁没被数据库日志坑过?本地日志散在各个服务器,排查问题时登录一台又一台机器,翻来翻去找不到关键信息;偶尔磁盘满了,日志被自动清理,出了故障连追溯的机会都没有;更别提合规审计要求,本地日志随便删、随便改,根本达不到要求。 今
作为运维或DBA,谁没被数据库日志坑过?本地日志散在各个服务器,排查问题时登录一台又一台机器,翻来翻去找不到关键信息;偶尔磁盘满了,日志被自动清理,出了故障连追溯的机会都没有;更别提合规审计要求,本地日志随便删、随便改,根本达不到要求。
今天就给大家分享一个实测可用、零成本落地的方案——用Linux自带的rsyslog服务,把所有数据库日志集中推送到syslog服务器,从此日志管理躺平,排查问题效率翻倍!全程无复杂操作,无额外组件依赖,小白也能跟着一步到位,亲测生产环境稳定运行,放心抄作业~
先跟大家说下本次实战的环境,很经典的客户端+服务端架构,大家可以直接对应自己的环境替换IP:
客户端:数据库服务器(同时也是rsyslog客户端),IP:192.168.1.201
服务端:专用syslog日志服务器,IP:192.168.1.202
全程操作都是Linux基础命令,不用写复杂脚本,跟着敲就行!
一、先唠唠:为啥非要把数据库日志推给syslog?
可能有人会问,数据库日志存在本地不也能用吗?那是你没遇到过这些糟心事:
单机存储太坑:磁盘满、误删、硬件坏了,日志直接永久丢失,出问题连“黑匣子”都没有;
多节点排查崩溃:如果有好几台数据库服务器,排查问题要逐个登录,翻不同目录的日志,半天找不到重点;
合规审计过不了:很多企业要求日志集中留存、不可篡改,本地日志随便清理,审计时直接翻车;
占用本地资源:数据库本身就耗资源,日志存本地还占磁盘,万一磁盘满了,直接影响数据库运行。
而syslog(咱们实际用的是增强版rsyslog)就不一样了,它是Linux系统自带的日志服务,轻量又稳定,几乎所有设备(服务器、路由器、数据库)都支持往它那发日志。把数据库日志推过去,相当于给所有日志建了个“统一档案室”,异地存储防丢失、统一检索省时间,还能满足合规要求,一举多得!
二、小科普:rsyslog核心知识点,不用深钻,懂这些就够
动手前先简单搞懂几个关键点,避免踩坑,不用死记硬背,知道怎么用就行:
rsyslog的双重身 份:它既能当“接收器”(服务端),监听端口接收其他设备的日志;也能当“发送器”(客户端),把本机的日志转发给远程服务器。咱们这次就是用它的双重身份,实现日志上送。
日志的“分类标签”:rsyslog用Facility(设施)给日志分类,比如系统日志、邮件日志,其中local0~local7是用户自定义的,专门用来存数据库、应用这类业务日志,咱们这次就用local0,避免和系统日志混在一起。
核心配置语法(记不住也没关系,后面直接抄):
加载UDP/TCP模块:开启端口监听,UDP轻量高效,TCP更可靠,咱们内网用UDP就够;
日志转发:local0.* @IP 就是用UDP把local0的所有日志,推给指定IP的syslog服务器;
日志模板:服务端用模板,能按客户端主机名、进程名自动分类存日志,不用手动整理,比如客户端node201的数据库日志,会自动存在/var/log/node201/kingbase.log里,找起来超方便。
三、第一步:部署syslog服务端(192.168.1.202),做个“日志接收器”
服务端的作用就是接收所有客户端发来的日志,然后分类存好,配置就4步,全程复制粘贴命令就行:
1. 修改主配置文件,开启端口监听
编辑/etc/rsyslog.conf文件,把UDP和TCP的监听模块打开,再配置日志存储模板:
命令:vi /etc/rsyslog.conf
找到对应内容,取消注释(或者直接添加)下面这些配置:
# 加载UDP接收模块,默认514端口
$ModLoad imudp
$UDPServerRun 514
# 加载TCP接收模块,备用
$ModLoad imtcp
$InputTCPServerRun 514
# 自定义日志存储模板,按主机名+进程名分类
#### 业务日志集中存储 ####
$template RemoteLogs,"/var/log/%HOSTNAME%/%PROGRAMNAME%.log"
*.* ?RemoteLogs
& ~ # 匹配后不再写入其他文件,避免日志重复
解释一下:& ~ 这个配置很重要,意思是日志按模板存好后,就不再往系统默认日志文件里写了,避免重复存储占磁盘。
