如何将数据库配置日志输出到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 & ~ # 匹配后不再写入其他文件,避免日志重复 解释一下:& ~ 这个配置很重要,意思是日志按模板存好后,就不再往系统默认日志文件里写了,避免重复存储占磁盘。 2. 修改启动参数,允许接收远程日志 编辑/etc/sysconfig/rsyslog,添加-r参数,不然服务端收不到远程日志: 命令:vi /etc/sysconfig/rsyslog 找到SYSLOGD_OPTIONS这一行,修改为: SYSLOGD_OPTIONS="-r -c 5" 简单说下:-r是允许接收远程日志,-c 5是用兼容模式,保证服务稳定运行,不用纠结太多,照改就行。 3. 重启服务,查看状态 配置改完,重启rsyslog服务才能生效,命令直接抄: systemctl restart rsyslog systemctl enable rsyslog # 设为开机自启,避免重启服务器后失效 systemctl status rsyslog 如果看到“active (running)”,就说明服务启动成功了,没报错就是好现象~ 4. 检查端口,确认监听成功 最后确认一下514端口是否被rsyslog监听,命令: netstat -antulp | grep 514 正常情况下,会显示tcp和udp的514端口都在监听,这样服务端就配置完成了,就等客户端发日志过来啦! 四、第二步:配置客户端(数据库服务器192.168.1.201),做个“日志发送器” 客户端不用开启监听,只要告诉rsyslog:把数据库的日志,推给咱们刚才部署的syslog服务端,配置更简单,就2步: 1. 配置日志转发规则 同样编辑/etc/rsyslog.conf,添加转发规则,命令:vi /etc/rsyslog.conf 直接在文件末尾添加下面这两行,不用改别的: #### 数据库日志配置 #### local0.* /home/kingbase/db/r6_c8/data/sys_log # 本地留存一份日志,可选,方便临时排查 local0.* @192.168.1.202 # 核心:把local0的日志推给syslog服务端 说明一下:第一行是本地备份日志,怕远程日志出问题时,本地有备份,可加可不加;第二行是关键,@后面跟的是syslog服务端的IP,别写错了! 2. 重启客户端rsyslog服务 配置改完,重启服务生效,命令和服务端一样: systemctl restart rsyslog systemctl status rsyslog 只要没报错,客户端就配置好了,接下来就是让数据库把日志发给rsyslog,这步是核心,别走神~ 第三步:让数据库“听话”,把日志输出到syslog 前面配置好了rsyslog的客户端和服务端,但数据库还不知道要把日志发给谁,所以这一步要告诉数据库:别再只把日志存本地了,发给syslog! 1. 修改数据库配置文件kingbase.conf 先切换到数据库用户,找到kingbase.conf配置文件,命令: su - kingbase vi /home/kingbase/db/r6_c8/data/kingbase.conf # 路径按自己的实际路径改 找到日志相关的参数,修改成下面这样,找不到就直接搜索(vi里按/搜索): # 日志输出目标:指定为syslog log_destination = 'syslog' # syslog设施:必须和rsyslog配置的local0一致,不然日志发不过去 syslog_facility = 'LOCAL0' # 日志标识:服务端会用这个名字建日志文件,好识别 syslog_ident = 'kingbase' # 下面两个可选,按需开启 # syslog_sequence_numbers = on # 开启序列号,防止日志丢失 # syslog_split_messages = on # 长日志自动拆分,避免显示不全 重点提醒:syslog_facility必须是LOCAL0(大小写没关系),和前面rsyslog配置的local0.*对应上,不然日志会发丢,这是最容易踩的坑! 2. 重启数据库,让配置生效 配置改完,重启数据库才能生效,命令: sys_ctl restart # 按自己数据库的重启命令来,比如用服务命令也可以 重启后别着急,先验证一下本地日志,看看是不是已经转向syslog了。 3. 验证本地日志,确认配置生效 进入数据库的本地日志目录,查看最新的日志文件,命令: cd /home/kingbase/db/r6_c8/data/sys_log ls -lh # 查看日志文件 cat 最新的日志文件名 如果看到下面这句话,就说明数据库配置成功了,日志已经开始往syslog发了: 2023-10-19 15:34:37.932 CST [4597] LOG: ending log output to stderr HINT: Future log output will go to log destination "syslog". 翻译一下就是:以后日志不往stderr输出了,都发给syslog啦! 第四步:验收成果!在syslog服务端查看远程日志 所有配置都完成了,最激动人心的时刻到了,去syslog服务端看看,能不能收到数据库的日志! 1. 找到日志存储路径 咱们在服务端配置了模板,日志会按“客户端主机名/进程名.log”的格式存储,路径是: /var/log/客户端主机名/进程名.log 2. 查看日志内容,确认成功 用cat命令查看日志文件,如果能看到数据库的启动、关闭、连接等日志,比如下面这样,就说明日志上送成功了! Oct 19 15:34:37 loe kingbase[4597]: LOG: database system is ready to accept connections 到这里,整个数据库日志集中上送syslog的配置就全部完成了,以后不管有多少台数据库服务器,日志都集中存在syslog服务端,排查问题直接去一个目录找,再也不用挨个登录机器了,是不是超省心! 总结 其实整个配置流程很简单,核心就是“服务端监听接收,客户端转发,数据库输出”,用Linux原生的rsyslog,零成本实现数据库日志集中管理,不用装任何第三方组件,稳定又省心。日志管理是运维的基础,把日志管好,不管是故障排查、安全审计,还是合规检查,都能省不少事。如果你也在为分散的数据库日志头疼,赶紧照着本文的步骤操作,几分钟就能搭建好一套稳定的日志集中化平台,亲测可用,放心冲! (注:文档部分内容可能由 AI 生成)