OceanBase在运行过程中会自动生成日志。维护工程师通过查看和分析日志,可以了解OceanBase的启动和运行状态。
日志概述
主要介绍日志清单、日志级别、查看日志的方法等。
日志清单
列出了OceanBase运行日志和操作日志的清单。OceanBase 日志清单如下表所示。
日志清单表
日志名称 | 日志路径 | 说明 |
observer.log | OBServer服务器的 “~/appname/log”目 录下。 | 记录OBServer启动过程以及启动后的运行情况。 |
Clog | OBServer服务器的 “~/datadir/clog”目 录下。 | Commit Log,所有Partition共用,日志可能是乱序的,记录事务、PartitionService提供的原始日志内容。此目录下的日志基于Paxos协议在多个副本之间同步。 |
Ilog | OBServer服务器的 “~/datadir/ilog”目 录下。 | Index Log,所有Partition共用,单Partition内部日志有序,记录Partition内部log_id>clog(file_id, offset)的索引信息。每个副本自行记录。 |
Slog | OBServer服务器的 “~/datadir/slog”目 录下。 | 记录Storage log,指SSTable操作日志信息。 |
关于Commit Log:
- 事务的日志包括:redo log, preparelog、commit log、abort log、clear log等。其中,redo log记录了事务的具体操作,比如某一行数据的某个字段从A修改为B。
- prepare log记录了事务的prepare状态;commit log表示这个事务成功commit,并记录commit的信息,比如事务的全局版本号;clear log用于通知事务清理事务上下文 ;abort log表示这个事务被回滚。
- 日志清单表中的clog是指广义的 Commit Log,代表整个事务的所有日志信息。
日志级别
介绍OceanBase日志的级别及每类级别的含义。当启动或运行异常时,可维护工程师可以通过日志级别和内容分析和定位异常原因。OceanBase的运行日志中的级别及含义如下表所示。日志级别从高到底排列。
日志级别及含义
日志级别 | 含义 |
ERROR | 严重错误,用于记录系统的故障信息,且必须进行故障排除,否则系统不可用。 |
WARN | 警告,用于记录可能会出现的潜在错误。 |
INFO | 提示,用于记录系统运行的当前状态,该信息为正常信息。 |
DEBUG | 调试信息,用于调试时更详细的了解系统运行状态,包括当前调用的函数名、参数、变量、函数调用返回值等。 |
TRACE | 与DEBUG相比更细致化的记录事件消息。 |
启动和运行日志
日志文件种类
- observer.log:OceanBase所有的启动过程和启动后的运行过程中的日志。
- election.log:选举模块记录的日志。
- rootservice.log:rootservice 模块记录的日志
- wf日志:只记录日志级别在 WARN 级别以上(包括 WARN 级别)的日志信息,打开该类日志文件,可以看到只有 WARN 和 ERROR 级别的日志。
查看日志
介绍了查看OceanBase日志的方法。
假设OBServer服务所在的IP为“10.10.10.2”,查看日志的步骤如下:
- 登录 OceanBase服务器(以10.10.10.2为例)。
- 执行以下命令,进入日志文件所在的目录。
cd ~/oceanbase/log
其中,oceanbase为实例名。
- 执行以下命令,查看已写入的日志记录。
more observer.log
或者执行以下命令,查看正在写入的日志记录。
tail observer.log
日志格式
日志记录主要由六部分组织:记录时间、日志级别、[模块名]、文件名:行号、线程ID和日志内容。关于模块名,是按OceanBase的功能模块划分,可以分为CLIENT、CLOG、COMMON、ELECT、LIB、PROXY、RPC、RS、SERVER、SHARE、SQL、STORAGE、TLOG等。每个模块下又有子模块,它以点隔开的形式写在模块后面。例如:SQL.PARSER中 SQL表示SQL模块,SQL.PARSER表示SQL模块下的PARSER子模块。
日志样例
[2015-08-06 15:34:30.006962] INFO [SQL.RESV] ob_basic_session_info.cpp:220 [84753][Y0-0] use database success.(database_name=oceanbase)
解释:执行SQL指令use database oceanbase成功。
日志种类详解
election日志
- 日志打印级别默认为 INFO 级别,即只有 INFO 及以上级别的日志数据才会打印到日志文件中,可通过 system parameter syslog_level 来查看当前设置的日志级别。
- 日志文件的大小不超过256M,如果当前election.log 或者election.log.wf 文件大小超过256M,那么会被进行切片,切片规则为将当前文件带上后缀yyyyMMddHHmmss 重命名,后缀时间为当前时间,同时新生成一个election.log 或者election.log.wf,切片生成的文件名如下:
[admin@OceanBase244000094.sqa.ztt /home/admin/oceanbase/log]
$ls -alh | egrep '[0-9]{14}' | grep election | grep -v wf
-rw-r--r-- 1 admin admin 256M Jul 7 05:34 election.log.20160707053424
-rw-r--r-- 1 admin admin 256M Jul 7 05:38 election.log.20160707053821
[admin@OceanBase244000094.sqa.ztt /home/admin/oceanbase/log]
$ls -alh | egrep '[0-9]{14}' | grep election | grep wf
-rw-r--r-- 1 admin admin 256M Jul 7 02:09 election.log.wf.20160707020914
-rw-r—r— 1 admin admin 256M Jul 7 05:34 election.log.wf.20160707053431
- 日志数据格式:election.log和election.log.wf 拥有相同的日志数据格式,均为:[time] log_level [module_name] function_name (file_name:file_no) [thread_id][Ytrace_id0-trace_id1] [log=last_log_print_time]log_data
[admin@OceanBase244000095.sqa.ztt /home/admin/oceanbase/log]
$tail -f election.log
[2016-07-17 01:02:28.610938] INFO [ELECT] statistics (ob_election_rpc.cpp:81) [23006][YB420AF40EB8-1602012] [log=27]election rpc statistics(total_process=16, avg_fly_us=-23, avg_wait_us=36, avg_handle_us=18)
[2016-07-17 01:02:34.211369] INFO [ELECT] statistics (ob_election_rpc.cpp:81) [23006][YB420AF40EB8-16020B3] [log=29]election rpc statistics(total_process=16, avg_fly_us=-28, avg_wait_us=35, avg_handle_us=16)
[2016-07-17 01:02:39.811105] INFO [ELECT] statistics (ob_election_rpc.cpp:81) [23004][YB420AF40EB8-1602136] [log=35]election rpc statistics(total_process=16, avg_fly_us=-30, avg_wait_us=35, avg_handle_us=15)
日志数据格式说明如下表所示。
参数 | 说明 |
time | 该条日志打印的时间 |
log_level | 该条日志的级别 |
module_name | 打印该条日志的语句所在模块 |
function_name | 打印该条日志的语句所在的函数 |
file_name | 打印该条日志的语句所在的文件 |
file_no | 打印该条日志的语句所在文件的具体行数 |
thread_id | 打印该条日志的线程的线程号。 |
trace_id0-trace_id1 | 该条日志的 traceid,由 traceid0 和 traceid1 组成,该 traceid 可通过 rpc 在各个 observer 间传递,从而可以根据 traceid 号来获取相互之间有关联关系的日志数据 |
last_log_print_time | 写上一条日志所用的数据,单位为 us,即在程序中调用一次日志打印所用的时间,当前的时间记录的是上一条日志打印所用的时间,通过该时间可以精确知道日志打印耗费时间,从日志数据中可以看到该值大部分时候是0,有时会是10us级别的。由于日志打印时是多个线程同时向同一个buffer来打印,所以会有临界区代码保护,从而是会出现 10us 日志打印时间的 |
log_data | 具体的日志数据 |
observer和rootservice日志
- 日志级别:同 election 日志
- 日志文件大小及切片规则:同 election 日志
- 日志数据格式:observer.log 和 rootservice.log 日志数据格式相同,格式如下:
[time] log_level [module_name] file_name:fine_no [thread_id][Ytrace_id0-trace_id1] [lt=last_log_print_time]log_data
observer.log.wf 和 rootservice.log.wf 日志数据格式相同,后两个相对于前两者的区别是打印了函数名称,格式如下:
[time] log_level [module_name] function_name (file_name:fine_no) [thread_id][Ytrace_id0-trace_id1] [lt=last_log_print_time]log_data
[admin@OceanBase244000094.sqa.ztt /home/admin/oceanbase/log]
$tail -f -n 1 observer.log
[2016-07-17 14:18:04.845802] INFO [RPC.OBMYSQL] obsm_handler.cpp:191 [9543][Y0-0] [lt=47] connection close(easy_connection_str(c)="127.0.0.1:56854_-1_0x7fb8a9171b68", version=0, sessid=2147562562, tenant_id=1, server_id=1, is_need_clear_sessid_=true, ret=0) $tail -f -n 1 observer.log.wf
[2016-07-17 14:18:28.431351] WARN [SQL.SESSION] set_conn (ob_basic_session_info.cpp:2568) [8541][YB420AF4005E-52A8CF4E] [lt=16] debug for set_conn(conn=0x7fb8a9171b68, lbt()="0x4efe71 0x818afd 0xe9ea5b 0x721fc8 0x13747bc 0x2636db0 0x2637d68 0x5054e9 0x7fb98705aaa1 0x7fb9852cc93d ", magic_num_=324478056, sessid_=2147562617, version_=0)
[admin@OceanBase244000094.sqa.ztt /home/admin/oceanbase/log]
$tail -f -n 1 rootservice.log [2016-07-17 14:18:53.701463] INFO [RS] ob_server_table_operator.cpp:345 [8564][Y0-0] [lt=11] svr_status(svr_status="active", display_status=1)
[admin@OceanBase244000094.sqa.ztt /home/admin/oceanbase/log]
$tail -f -n 1 rootservice.log.wf
[2016-07-16 02:02:12.847602] WARN [RS] choose_leader (ob_leader_coordinator.cpp:2067) [8570][YB420AF4005E-4626EDFC] [lt=8] choose leader info with not same candidate num(tenant_id=1005, server="10.244.14.185:2882", info={original_leader_count:0, primary_zone_count:0, cur_leader_count:1, candidate_count:1, in_normal_unit_count:1})
- 日志数据格式说明:同election日志
- 控制切片文件数量:
- 通过设置系统参数max_syslog_file_count的值来控制日志文件数量保留的数量,当为0时表示observer进程自己不对日志文件数量进行控制,当为一个非0正数时,observer进程会将没一类日志文件数量都控制不超过该数量,即如果设置max_syslog_file_count为100, 则observer.log、observer.log.wf、rootservice.log、rootservice.log.wf的日志文件数量各自都不会超过100个。这里需要特别注意的一点是,只有在设置了max_syslog_file_count为非0,observer才会开始统计切片生成的日志文件列表,只有当改日志文件列表中的文件数量超过设定值后,observer才会进行老的日志切片文件的删除。
- 通过启动observer进程时在
-o
参数中指定max_syslog_file_count的值。
事务日志
clog和 ilog记录所有的事务日志信息。不用于用户查看和定位系统问题。通过内部定制的工具log_tool来解析日志信息。
存储日志
slog记录所有的存储(SSTable)日志信息。不用于用户查看和定位系统问题。通过内部定制的工具log_parser来解析日志信息。