複数のタイムスタンプを持つログ・レコードの解析
一部のログ・レコードには、ログ・エントリ時間や、プロセスまたはトランザクションの開始時間および終了時間などの複数のタイムスタンプが含まれることがあり、それらを独自のフィールドに取得できます。独自のフィールドに開始時間と終了時間を取得した後で、eval
コマンドを使用して、このようなフィールドに日付操作を実行できます(たとえば、2つの時間の間の期間を取得できます)。evalを参照してください。
Oracle Logging Analyticsには、実際のログ・エントリ時間ではない日時情報を格納できるOracle定義フィールドがいくつかあります:
-
イベント終了時間
-
イベント開始時間
-
イベント生成時間
-
初回イベント時間
-
契約終了時間
-
契約開始時間
-
アラート発生時間
-
収集時間
-
検出時間
これらのフィールドに格納されるデータは、ISO-8601フォーマットである必要があります:
2018-07-04T23:43:34.000Z
パーサーの作成時に、{TIMEDATE}
マクロを1回のみ使用してログ・エントリ時間を表すことができます。追加の時間フィールドについては、ユース・ケースに応じて、次のいずれかの方法を使用してデータを抽出する必要があります。
ケース1: ログにはすでにISO-8601フォーマットの日時情報があります
ログにすでにISO-8601フォーマットの追加の日時情報がある場合、拡張フィールド定義のベース・パーサーでそれらを文字列として抽出できます。
次のサンプル・ログを考えます:
July 4, 2018 23:43:12 Server1 ModuleA Transaction completed. Start=2018-07-04T23:45:34.000Z, End=2018-07-04T23:46:39.000Z
ログには、ログ・エントリ、開始時間および終了時間の日時情報が含まれます。
-
ログ・エントリ時間を取得するには、ベース・パーサーを作成します。パーサーの作成を参照してください。
{TIMEDATE}\s(\S+)\s(\S+)\s(.*)
-
「ソースの作成」ダイアログ・ボックスを開きます。ソースの作成を参照してください。
-
ステップ1で作成したベース・パーサーを選択します。
-
サンプル・ログのファイル・パスを指定します。
-
「拡張フィールド」タブで、拡張フィールド定義をログ・ソースに追加して、日時フィールドを抽出します:
-
「メッセージ」フィールドから:
Start={Event Start Time:\S+}
-
「メッセージ」フィールドから:
End={Event End Time:\S+}
-
-
作成した新しいソースを保存します。
2つのフィールド「イベント開始時間」および「イベント終了時間」にログからの値が移入されていることがわかります。ログ・エクスプローラでは、エポック以降のミリ秒として時間が表示されます。
ケース2: ログにISO-8601フォーマットの日時情報がありません
抽出する追加の時間フィールドがISO-8601フォーマットではない場合、解析のために次のステップに従う必要があります:
ファイル全体が1つのログ・エントリであるログ・ファイルの例を考えます:
+---------------------------------------------------------------------------+
Application Object Library: Version : 12.2
Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
FNDWFBG: Workflow Background Process
+---------------------------------------------------------------------------+
Current system time is 04-JUL-2018 17:25:23
+---------------------------------------------------------------------------+
**Starts**04-JUL-2018 17:25:23
**Ends**04-JUL-2018 18:25:23
+---------------------------------------------------------------------------+
Start of log messages from FND_FILE
+---------------------------------------------------------------------------+
+---------------------------------------------------------------------------+
End of log messages from FND_FILE
+---------------------------------------------------------------------------+
Successfully resubmitted concurrent program FNDWFBG with request ID 239834523 to start at 04-JUL-2018 18:30:23 (ROUTINE=IERKWEP)
+---------------------------------------------------------------------------+
No completion options were requested.
Output file size:
0
Output is not being printed because:
The print option has been disabled for this report.
+---------------------------------------------------------------------------+
Concurrent request completed successfully
Current system time is 04-JUL-2018 18:30:23
+---------------------------------------------------------------------------+
-
ベース・パーサーを作成します。パーサーの作成を参照してください。
.*?Current system time is {TIMEDATE}.*\*\*Starts\*\*([\S\ ]+).*?\*\*Ends\*\*([\S\ ]+).*
解析のために選択する必要があるフィールドは次のとおりです:
-
バージョン
-
イベント開始時間
-
イベント終了時間
前述のサンプル・ログでは、「ファイル全体を単一ログ・エントリとして処理」チェック・ボックスを選択します。ヘッダー正規表現は不要です。
-
-
「ログ・ソースの作成」ダイアログ・ボックスを開きます。ソースの作成を参照してください。
-
ステップ1で作成したベース・パーサーを選択します。
-
サンプル・ログのファイル・パスを指定します。
-
「データ・フィルタ」タブに移動します。
-
月の短縮名を数値に変換します:
ログに月名ではなく、すでに数値の月番号がある場合は、このステップをスキップしてステップ7に進むことができます。
ログに月番号ではなく月の短縮名がある場合、月の短縮名を月番号に変換するには、「マスク」タイプの12個のデータ・フィルタを追加します。
各カレンダ月のデータ・フィルタの詳細は、次の1月に関するものと同様です:
-
名前:
Jan to 01
-
タイプ:
Mask
-
検出式:
(\*\*\w+\*\*\d{2}-)(JAN)(-\d{4})
-
置換式:
$101$3
データ・マスクによって、ログに出現する時間パターンが検索されます:
**Starts**04-JAN-2018 17:25:23
JAN
の前のデータ、値JAN
、およびJAN
の後のデータが3つの取得グループに取得されます。取得グループは、カッコ( )
の3つのペアで示されます。次に、置換式で、最初の取得グループの値は
$1
を使用して置き換えられ、値JAN
は01
で置き換えられ、3番目の取得グループは$3
を使用して置き換えられます。データ・フィルタが実装されると、日時情報は次のように表示されます:
**Starts**04-01-2018 17:25:23
-
-
日時情報をISO-8601フォーマットでリライトします:
日時情報を適切なデータ型で使用できるようになったら、サンプル・ログの2つのデータ・フィルタを使用して日時データをISO-8601フォーマットでリライトします:
これらの2つのデータ・フィルタは、月の短縮名を月番号に変換するために作成した12個のデータ・フィルタの後に配置する必要があります。これにより、月の短縮名が月番号に変換された後に日時データ・フォーマットが評価されるようになります。データ・フィルタの順序を変更するには、上下の矢印を使用します。
次の2つのデータ・フィルタを作成して、開始時間と終了時間のデータをISO-8601フォーマットに変換します:
-
-
名前:
Change shape of Starts
-
タイプ:
Mask
-
検出式:
\*\*Starts\*\*(\d+)-(\d+)-(\d{4})\s(\d{2}:\d{2}:\d{2})
-
置換式:
\*\*Starts\*\*$3-$2-$1T$4.000Z
-
-
-
名前:
Change shape of Ends
-
タイプ:
Mask
-
検出式:
\*\*Ends\*\*(\d+)-(\d+)-(\d{4})\s(\d{2}:\d{2}:\d{2})
-
置換式:
\*\*Ends\*\*$3-$2-$1T$4.000Z
-
検出式では、日時の各要素が取得されます。置換式では、日時要素の順序が変更されます。値
$1
、$2
、$3
および$4
は、検出式の取得グループに対応しています。取得グループは、カッコ( )
のペアで示されます。静的な
.000Z
が置換式で追加され、時間と日付の値がフィールドに格納されます。これにより、日時は事実上、協定世界時(UTC)のタイムゾーンで記録されます。かわりにログ・エントリが太平洋標準時(PST)のタイムゾーンである場合、そのタイムゾーンは人工的にUTCに変更されますが、実際の時間シフトはありません。ノート
現在、収集時に時間と日付の値を異なるタイムゾーンにシフトすることはできません。ただし、evalコマンドを使用して、ログ・エクスプローラからこれを実行できます:-
イベント開始時間とイベント終了時間を格納した後、イベント開始時間からイベント終了時間を差し引いてイベント期間を取得します。
-
ミリ秒単位で計算されたタイムゾーン間の時間差の期間を加算または減算します。
-
出力をミリ秒数から日時フォーマットに変換します。
-
-
「拡張フィールド」タブで、拡張フィールド定義をログ・ソースに追加して、日時フィールドを抽出します:
-
「メッセージ」フィールドから:
\*\*Starts\*\*{Event Start Time:\S+}
-
「メッセージ」フィールドから:
\*\*Ends\*\*{Event Start Time:\S+}
-
-
作成した新しいログ・ソースを保存します。
2つのフィールド「イベント開始時間」および「イベント終了時間」にログからの日時の値が移入されていることがわかります。ログ・エクスプローラでは、エポック以降のミリ秒として時間が表示されます。