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”,查看日志的步骤如下:

    1. 登录 OceanBase服务器(以10.10.10.2为例)。
    2. 执行以下命令,进入日志文件所在的目录。
    1. cd ~/oceanbase/log

    其中,oceanbase为实例名。

    1. 执行以下命令,查看已写入的日志记录。
    1. more observer.log

    或者执行以下命令,查看正在写入的日志记录。

    1. 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子模块。

    日志样例

    1. [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,切片生成的文件名如下:
    1. [admin@OceanBase244000094.sqa.ztt /home/admin/oceanbase/log]
    2. $ls -alh | egrep '[0-9]{14}' | grep election | grep -v wf
    3. -rw-r--r-- 1 admin admin 256M Jul 7 05:34 election.log.20160707053424
    4. -rw-r--r-- 1 admin admin 256M Jul 7 05:38 election.log.20160707053821
    5. [admin@OceanBase244000094.sqa.ztt /home/admin/oceanbase/log]
    6. $ls -alh | egrep '[0-9]{14}' | grep election | grep wf
    7. -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
    1. [admin@OceanBase244000095.sqa.ztt /home/admin/oceanbase/log]
    2. $tail -f election.log
    3. [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)
    4. [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)
    5. [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.wfrootservice.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

    1. [admin@OceanBase244000094.sqa.ztt /home/admin/oceanbase/log]
    2. $tail -f -n 1 observer.log
    3. [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
    4. [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)
    5. [admin@OceanBase244000094.sqa.ztt /home/admin/oceanbase/log]
    6. $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)
    7. [admin@OceanBase244000094.sqa.ztt /home/admin/oceanbase/log]
    8. $tail -f -n 1 rootservice.log.wf
    9. [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日志
    • 控制切片文件数量:
    1. 通过设置系统参数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才会进行老的日志切片文件的删除。
    2. 通过启动observer进程时在 -o 参数中指定max_syslog_file_count的值。

    事务日志

    clog和 ilog记录所有的事务日志信息。不用于用户查看和定位系统问题。通过内部定制的工具log_tool来解析日志信息。

    存储日志

    slog记录所有的存储(SSTable)日志信息。不用于用户查看和定位系统问题。通过内部定制的工具log_parser来解析日志信息。