システムログ(SysLog)とは、OceanBaseデータベースプログラムのログを指します。OceanBaseデータベースが実行中に自動的に出力されるログであり、監視アラートや診断に使用されます。システムログはモニタリング指標を補完する強力な手段であり、両者が共にOceanBaseデータベースの可観測性を支えています。
システムログとトランザクションログは、一部のシナリオでは「ログ」と略されることがありますが、両者はまったく異なるものです。
システムログ(SysLog):OceanBaseデータベースプロセスの実行中に出力されるログであり、監視アラートや診断に使用されます。これは可観測性分野の内容です。
トランザクションログ(commit log、略称clog):OceanBaseにおいて、データ永続化よりも先に生成されるWALであり、トランザクションの整合性を保証しデータ一貫性を保つために使用されます。
ログモジュール
プログラムログは異なるモジュールに分かれており、親モジュールとサブモジュールの2つのレベルがあります。
OceanBaseデータベースの親モジュールには、
CLIENT、CLOG、COMMON、ELECT、LIB、PROXY、RPC、RS、SERVER、SHARE、SQL、STORAGE、TLOGなどが含まれます。親モジュールにサブモジュールが含まれる場合、
親モジュール.サブモジュールの形式で表記されます。例えば、SQL.PARSERはSQLモジュールの下にあるPARSERサブモジュールを表し、SQL.*はSQLモジュールのすべてのサブモジュールを表します。
ログファイル
OceanBaseデータベースのログモジュールに属するログファイルには、observer.log、election.log、rootservice.log、trace.log、alert.log の5種類があり、デフォルトではINFOレベル以上のログが出力されます。
trace.log、alert.log ファイルを除き、各ログファイルタイプごとに .wf 拡張子を持つWARNINGログファイル(observer.log.wf、election.log.wf、rootservice.log.wf)が自動的に生成され、WARNレベル以上のログのみが出力されます。WARNINGログファイルの生成は、クラスタ構成パラメータ enable_syslog_wf で制御されます。
| ログ名 | ログパス |
|---|---|
起動および実行ログ(observer.log、observer.log.wf) |
OBServerサーバーの $work_dir/log ディレクトリ。 |
選出ログ(election.log、election.log.wf) |
OBServerサーバーの $work_dir/log ディレクトリ。 |
Root Serviceログ(rootservice.log、rootservice.log.wf) |
OBServerサーバーの $work_dir/log ディレクトリ。 |
| 全リンクトレースログ(trace.log) | OBServerサーバーの $work_dir/log ディレクトリ。 |
| 警告ログ(alert.log) | OBServerサーバーの $work_dir/log/alert ディレクトリ。 |
OceanBaseデータベースの個々のログファイルのサイズは256MBを超えません。ログファイルのサイズが256MBに達した場合、システムはログローリングを行います。元のログファイルには、後ろにサイズを示す接尾辞(形式は yyyyMMddHHmmss)が付加され、その時間はこのログファイル内の最後のログが生成された時刻となります。そして新しいログファイルが作成されます。ログローリングが発生した場合、.wf ログファイルは256MBに達していなくても一緒にローリングされます。つまり、xxx.log.wf ファイルと xxx.log ファイルは常に一対一で対応しており、.wf ファイルは一般的に256MBよりもはるかに小さいです。
典型的なログファイルディレクトリは以下のとおりです:
log
├── election.log
├── election.log.wf
├── observer.log
├── observer.log.20220427154619
├── observer.log.wf
├── observer.log.wf.20220427154619
├── rootservice.log
├── rootservice.log.20220427165438
├── rootservice.log.wf
├── rootservice.log.wf.20220427165438
└── log
├── alert.log
└── alert.log.20220304102928236
OceanBaseデータベースは、ログアーカイブをネイティブにサポートしています(クラスタ構成パラメータ enable_syslog_recycle で制御)。ログファイルの総数が max_syslog_file_count に達した場合、ログローリング時に最も古いログファイルが削除されます。ログファイルの最大容量使用量は、次の式で評価できます:max_syslog_file_count * 256M * 3 * (enable_syslog_wf ? 2 : 1)。
OceanBaseデータベースのネイティブなログアーカイブ機能は、ファイル数に基づいてログをアーカイブします。OceanBaseデータベースが外部管理システム(例えばOCP)と一緒にデプロイされる場合、通常は外部管理システムが提供するディスク容量利用率に基づくログアーカイブ機能が使用されます。
ログフォーマット
典型的な1行のログとそのフォーマットは以下のとおりです。
通常の1行のログ:
[2022-04-29 16:39:55.186527] WARN [COMMON] get_file_id_range (ob_log_file_group.cpp:127) [103594] [0] [Y0-0000000000000000-0-0] [lt=17] [dc=0] max file does not exist(max_file_id=4, b_exist=false)
ログを分解すると、ログフォーマットが得られます:
- time:
[2022-04-29 16:39:55.186527] - log_level:
WARN - module:
[COMMON] - function:
get_file_id_range - file_name:line_number:
(ob_log_file_group.cpp:127) - thread_id:
[103594] - coroutine_id:
[0] - trace_id:
[Y0-0000000000000000-0-0] - log_used_time:
[lt=17] - dropped_msg_count:
[dc=0] - info:
max file does not exist - parameter:
(max_file_id=4, b_exist=false)
ログフォーマットは2つの部分に分かれています:
- header:
[2022-04-29 16:39:55.186527] WARN [COMMON] get_file_id_range (ob_log_file_group.cpp:127) [103594] [0] [Y0-0000000000000000-0-0] [lt=17] [dc=0] - message:
max file does not exist(max_file_id=4, b_exist=false)
上記のフォーマットに示されているように、1つのログはヘッダー(header)とメッセージ本体(message)で構成されています:
header部分:
- time:このログが出力された時間。
- log_level:このログのレベル。現在サポートされているレベルは以下のとおりです(高い順):ERROR、USER_ERR、WARN、INFO、TRACE、DEBUG。
- module:現在ログを出力しているモジュール名。親モジュールと子モジュールで構成されており、OceanBaseデータベースではモジュールごとにログレベルを指定できます。
- function:現在ログを出力している関数名。
- file_name:line_number:現在ログを出力しているソースコードファイル名と行番号。
- thread_id:現在ログを出力しているスレッドID。
- coroutine_id:現在ログを出力しているコルーチンID。
- trace_id:タスクを追跡するためのtrace_id。タスクレベルで一意であり、このtrace_idはRPCを通じて各OBServer間で転送されるため、trace_idに基づいてタスクのすべてのログデータを取得できます。これは
GV$OB_SQL_AUDITビューのTRACE_IDフィールドに対応します。 - log_used_time:前のログの処理時間を指します(非同期ログシナリオではログのファイルへの書き込み時間を含みます)。
- dropped_msg_count:
dc=xxで、ここでxxは前のログから現在のログまでの間に破棄されたログの数を表します。破棄されていない場合は0です。
message部分:メッセージ本体は一般的にメッセージの説明情報(info)とパラメータ(parameter)で構成されています。
- info:具体的なログ内容。
- parameter:
name=valueのリスト形式で構成されるKVリスト。value部分が単純型の場合は直接表示され、複雑型の場合はJSON形式のテキストとして表示されます(可読性を向上させるため、JSON形式のKEY上の"は削除されています)。