OceanBase的系统日志(syslog)类似mysql的errorlog,是排查数据库问题的必备手段。系统日志一般位于observer的运行日志目录下。系统日志分了三种类型:observer.log、election.log和rootservice.log。

observer.log是每个observer的启动和运行日志,也是排查问题使用最多的日志。election.log是选举日志,顾名思义,主要记录分布式集群中选主的运行日志。rootservice.log,rootservice是ob集群的总控服务,负责ob集群的资源管理、负载均衡等,一般rootservice运行在某个observer上。

OceanBase数据库日志划分了6个级别,由高到低:ERROR、USER_ERROR、WARN、INFO、TRACE、DEBUG。可以通过系统参数syslog_level调整日志打印级别,参数值默认为INFO,即打印INFO及其以上的日志。在日志的目录中,除了observer.log文件还可以看到observer.log.wf文件,observer.log.wf日志文件只打印WARN及其级别以上的日志。值得注意的是WARN及其级别以上的日志在observer.log中也会打印,observer.log.wf更多的是方便排查和定位问题。通过集群参数enable_syslog_wf 可以控制是否把 WARN 以上级别的系统日志打印到一个单独的日志文件中,默认是True。

在日志目录下,可以看到很多带了时间戳的日志文件,这就是ob的日志轮转。ob中单个日志文件不超过256M,当observer.log写入达到256M时,原日志文件会停止写入并追加一个时间戳进行归档,日志写入到新生成的observer.log文件中。并且发生日志轮转时,wf日志文件即使没到 256MB 也会一起轮转,xxx.log.wf文件和xxx.log文件总是一一对应的。

[root@observer1log]#ll|grepobserver|more-rw-r--r--1adminadmin46086514Jul1115:10observer.log-rw-r--r--1adminadmin268438518Jul1102:18observer.log.20230711021818-rw-r--r--1adminadmin268440731Jul1102:18observer.log.20230711021820-rw-r--r--1adminadmin268440219Jul1102:18observer.log.20230711021821-rw-r--r--1adminadmin268438515Jul1102:18observer.log.20230711021823

日志自动清理。集群参数enable_syslog_recycle默认为True,代表开启自动清理日志。清理的阈值以文件数来确认,集群参数max_syslog_file_count表示最大日志文件数量。生产环境中设置的是300,需要注意的是max_syslog_file_count是指某种类型的日志文件数量,observer.log和observer.log.wf文件数量的上限都是300,此外还有election.log、election.log.wf、rootservice.log、rootservice.log.wf。因此日志文件总数应该是1800左右。

日志格式,从observer.log.wf文件可以看出,ob的日志内容是十分详细的,并且给出了源码打印日志的代码和函数,非常方便debug。但是,ob的日志相对比较原始,可读性较差,内容比较繁重,从这方面看会不利于问题的排查。

[root@observer1log]#tail-10fobserver.log.wf.20230711161459[2023-07-1116:14:58.815577]WARNload_file_to_string(utility.h:579)[3700602][0][Y0-0000000000000000-0-0][lt=10][dc=0]read/sys/class/net/team0/speedfailed,errno22[2023-07-1116:14:58.815586]WARNget_ethernet_speed(utility.cpp:628)[3700602][0][Y0-0000000000000000-0-0][lt=7][dc=0]loadfile/sys/class/net/team0/speedfailed,rc-4000[2023-07-1116:14:58.815591]WARN[SERVER]get_network_speed_from_sysfs(ob_server.cpp:1868)[3700602][0][Y0-0000000000000000-0-0][lt=3][dc=0]cannotgetEthernetspeed,usedefault(tmp_ret=0,devname="team10")

OceanBase的系统日志十分详细且复杂,通常一套OB集群需要规划300G的空间来放系统日志,这放在其他数据库是难以想象的。MySQL的错误日志一般最大也就几个G,也不需要日志的自动清理机制,从MySQL部署开始所有的错误日志都可以回溯。OceanBase复杂的日志内容相对会不方便排查问题,个人认为精简易用是OceanBase系统日志后续需要优化的一个方向,毕竟有时候简单好用才能让更多的人上手,累积更多的用户。