ロギング問合せ言語仕様

処理モデル

ロギング問合せ言語の処理は、データ・フロー・モデルに基づきます。各問合せは1つ以上のログを参照し、結果として表データ・セットを生成する必要があります。問合せ言語には、構造化ログと非構造化ログを検索、フィルタ処理および集計するための演算子がいくつか用意されています。

ログ・ストリーム

検索を開始するには、まず検索するログのセットを定義する必要があります。特定のログ・オブジェクト、ログ・グループまたは区分を検索できます。必要な数のログを混在させて照合できます。検索範囲は、次のパターンを使用して定義されます。
search "compartmentOcid/logGroupNameOrOcid/logNameOrOcid"

問合せ言語は、指定したスコープからログ・エントリをフェッチし、フィルタ、集計および視覚化できるログ・ストリームを作成します。

フィールド

ログ・ストリームのすべてのフィールドで、大/小文字が区別されます。実際のログには小文字でのみ索引付けされたフィールドがありますが、大/小文字混在で問合せに新しいフィールドを作成できます。
search "..."
   | select event as EventName

データ型

次のキー・データ型が問合せ言語でサポートされています。対応する型の値の表現については、リテラルを参照してください。

  • 文字列
  • 数値(整数、浮動小数点)
  • アレイ
  • ブール値
  • タイムスタンプ
  • 間隔

ステートメント

問合せは、1つ以上の文で構成されます。最後の文はデータを生成する必要があります。次の文タイプがサポートされています。

  • パラメータの設定
  • ストリーム式

ストリーム式

ストリームを生成するすべての式はストリーム式です。ストリーム式は、次の演算子を使用して作成できます。

  • ストリーミング演算子
  • 集計演算子

パイプ(|)

パイプは左側の演算子を右側のストリーム式に適用します。パイプ式はストリーム式です。

パイプの右側の演算子は、1つのストリームのみを消費する必要があります(集合演算、フィルタなど)。

右側の式の左側は「現在のストリーム」になり、現在のストリーム内のすべてのフィールドを短縮名で使用できるようになります。
search "application"
  | where level = 'ERROR'
 
>>
{"timestamp": "2019-01-03T00:04:01", "level":"ERROR", "host":"host1", "message":"download failed...", "impact":2}
{"timestamp": "2019-01-03T00:06:39", "level":"ERROR", "host":"host2", "message":"reached 90% file size limit... ", "impact":4}
{"timestamp": "2019-01-03T00:06:59", "level":"ERROR", "host":"host2", "message":"reached 95% file size limit... ", "impact":5}

演算子

拡張問合せを実行する場合、次のものがサポートされます。
  • ストリーム演算子
  • スカラー演算子
  • 集約

ストリーム演算子

ストリーム演算子は、ログ・エントリをフィルタで除外または変更することで、ログ・ストリームを作成または変更します。

search
実際のログ・オブジェクトからログ・ストリームを構築します。詳細は、ログ・ストリームを参照してください。
search "loggroup1/logname1" "loggroup2/logname2" "compartmentOCID/loggroup3/logname3"
where
ブール式を使用して現在のログ・ストリームをフィルタ処理します。
search "application"
  | where level = 'ERROR'
>>
{"timestamp": "2019-01-03T00:04:01", "level":"ERROR", "host":"host1", "message":"download failed...", "impact":2}
{"timestamp": "2019-01-03T00:06:39", "level":"ERROR", "host":"host2", "message":"reached 90% file size limit... ", "impact":4}
{"timestamp": "2019-01-03T00:06:59", "level":"ERROR", "host":"host2", "message":"reached 95% file size limit... ", "impact":5}
この式は複雑なブール式にすることができます。
search "application"
   | where ( level = 'ERROR' or level = 'INFO' )
      and host='host1' and "opc-request-id" ~ '.*AAAA.*'
>>
{"timestamp": "2019-01-03T00:04:01", "level":"ERROR", "host":"host1", "message":"download failed...", "impact":2}
{"timestamp": "2019-01-03T00:04:05", "level":"INFO", "host":" host1", "message":"host list updated..."}
whereはオプションです。
search "application"
   | level = 'ERROR'
ログの内容全体にフィルタを指定すると、全文検索を実行できます。logContentを検索すると、値が文字列と一致するログ行が返されます。この機能ではワイルドカードがサポートされています。
search "application"
   | where logContent = 'ERROR' -- returns log lines with a value matching "ERROR"
search "application"
   | where logContent = '*ERROR*' -- returns log lines with a value containing "ERROR"
top
式に基づいて、現在のログ・ストリームから指定された数の行のみをフェッチします。行数は正の定数整数である必要があり、ソート式を指定する必要があります。
search "application"
  | top 3 by impact
>>
{"timestamp": "2019-01-03T00:06:59", "level":"ERROR", "host":"host2", "message":"reached 95% file size limit... ", "impact":5}
{"timestamp": "2019-01-03T00:06:39", "level":"ERROR", "host":"host2", "message":"reached 90% file size limit... ", "impact":4}
{"timestamp": "2019-01-03T00:04:01", "level":"ERROR", "host":"host1", "message":"download failed...", "impact":2}
sort
現在のログ・ストリームを指定された列で昇順(デフォルト)または降順にソートします。演算子はDESCおよびASCキーワードを使用して順序のタイプを指定します。
search "application"
  | sort by impact desc
>>
{"timestamp": "2019-01-03T00:06:59", "level":"ERROR", "host":"host2", "message":"reached 95% file size limit... ", "impact":5}
{"timestamp": "2019-01-03T00:06:39", "level":"ERROR", "host":"host2", "message":"reached 90% file size limit... ", "impact":4}
{"timestamp": "2019-01-03T00:04:01", "level":"ERROR", "host":"host1", "message":"download failed...", "impact":2}
{"timestamp": "2019-01-03T00:05:33", "level":"WARNING", "host":"host2", "message":"reached 70% file size limit... ", "impact":1}
{"timestamp": "2019-01-03T00:04:05", "level":"INFO", "host":" host1", "message":"host list updated..."}
{"timestamp": "2019-01-03T00:06:59", "level":"INFO", "host":" host2", "message":"fs clean up started..."}
複数の列を使用して順序を指定できます。
search "application"
  | sort by host, impact desc
>>
{"timestamp": "2019-01-03T00:06:59", "level":"ERROR", "host":"host2", "message":"reached 95% file size limit... ", "impact":5}
{"timestamp": "2019-01-03T00:06:39", "level":"ERROR", "host":"host2", "message":"reached 90% file size limit... ", "impact":4}
{"timestamp": "2019-01-03T00:05:33", "level":"WARNING", "host":"host2", "message":"reached 70% file size limit... ", "impact":1}
{"timestamp": "2019-01-03T00:06:59", "level":"INFO", "host":" host2", "message":"fs clean up started..."}
{"timestamp": "2019-01-03T00:04:01", "level":"ERROR", "host":"host1", "message":"download failed...", "impact":2}
{"timestamp": "2019-01-03T00:04:05", "level":"INFO", "host":" host1", "message":"host list updated..."}
dedup
指定された列ですべての重複をフィルタで除外して、現在のログ・ストリームを処理します。複数のカラムを指定する場合は、すべてのカラムをコンマで区切る必要があります。
search "application"
  | dedup host
>>
{"timestamp": "2019-01-03T00:04:01", "level":"ERROR", "host":"host1", "message":"download failed...", "impact":2}
{"timestamp": "2019-01-03T00:05:33", "level":"WARNING", "host":"host2", "message":"reached 70% file size limit... ", "impact":1}
search "application"
  | dedup host, impact
{"timestamp": "2019-01-03T00:04:01", "level":"ERROR", "host":"host1", "message":"download failed...", "impact":2}
{"timestamp": "2019-01-03T00:05:33", "level":"WARNING", "host":"host2", "message":"reached 70% file size limit... ", "impact":1}
{"timestamp": "2019-01-03T00:06:39", "level":"ERROR", "host":"host2", "message":"reached 90% file size limit... ", "impact":4}
{"timestamp": "2019-01-03T00:06:59", "level":"ERROR", "host":"host2", "message":"reached 95% file size limit... ", "impact":5}
select
現在のログ・ストリームに一連の名前付きスカラー式を適用します。selectの集計バージョンについては、summarizeを参照してください。
search "application"
  | select level, host, impact+10 as impact, timestamp
>>
{"level":"ERROR", "host":"host1", "impact": 12, "timestamp": "2019-01-03T00:04:01"}
{"level":"INFO", "host":" host1", "timestamp": "2019-01-03T00:04:05"}
{"level":"WARNING", "host":"host2", "impact": 11, "timestamp": "2019-01-03T00:05:33"}
{"level":"ERROR", "host":"host2", "impact": 14, "timestamp": "2019-01-03T00:06:39"}
{"level":"ERROR", "host":"host2", "impact": 15, "timestamp": "2019-01-03T00:06:59"}
{"level":"INFO", "host":" host2", "timestamp": "2019-01-03T00:06:59"}
extend
計算された列で現在のログ・ストリームを拡張します。
search "application"
  | extend concat(host, 'us.oracle.com') as fqn
>>
{"timestamp": "2019-01-03T00:04:01", "level":"ERROR", "host":"host1", "message":"download failed...", "impact":2, "fqn": "host1.us.oracle.com"}
{"timestamp": "2019-01-03T00:04:05", "level":"INFO", "host":" host1", "message":"host list updated...", "fqn": "host1.us.oracle.com"}
{"timestamp": "2019-01-03T00:05:33", "level":"WARNING", "host":"host2", "message":"reached 70% file size limit... ", "impact":1, "fqn": "host2.us.oracle.com"}
{"timestamp": "2019-01-03T00:06:39", "level":"ERROR", "host":"host2", "message":"reached 90% file size limit... ", "impact":4, "fqn": "host2.us.oracle.com"}
{"timestamp": "2019-01-03T00:06:59", "level":"ERROR", "host":"host2", "message":"reached 95% file size limit... ", "impact":5, "fqn": "host2.us.oracle.com"}
{"timestamp": "2019-01-03T00:06:59", "level":"INFO", "host":" host2", "message":"fs clean up started...", "fqn": "host2.us.oracle.com"}
rex
指定された正規表現によってRAWメッセージまたはテキスト列から抽出された値で現在のログ・ストリームを拡張します。
search "application"
 | rex(raw, /reached (?<percentage>[0-9]+)%/)
 | where !isnull(percentage)
 | select host, percentage
>>
{"host": 'host2', percentage: '70'}
{"host": 'host2', percentage: '90'}
{"host": 'host2', percentage: '95'}
explode
指定された配列に基づいて、行を現在のストリーム内の複数のエントリに展開します。
search "application"
 | select host
 | dedup by host
 | explode([1,2,3]) as num
>>
{"host": "host1", "num": "1"}
{"host": "host1", "num": "2"}
{"host": "host1", "num": "3"}
{"host": "host2", "num": "1"}
{"host": "host2", "num": "2"}
{"host": "host2", "num": "3"}

スカラー演算子

個々の値に適用可能なスカラー演算子:
Arithmetic operations:
: - <expr>
: <expr1> + <expr2>
: <expr1> * <expr2>
: <expr1> - <expr2>
: <expr1> / <expr2>
Boolean operations:
: <expr1> OR <expr2>
: <expr1> AND <expr2>
: NOT <expr1>
Functions/UDFs:
: <func>(<arg1>[, ...])
: CAST(<expr> AS <type>)
String operations:
: <expr> ~ /regex/   # regex matching 
: <expr> = <string>  # substring matching

集計演算子

count
現在のログ・ストリーム内の行数を計算します。
search "application"
  | count
>>
{"count": 6}
summarize

指定された列および時間間隔で現在のログ・ストリームをグループ化し、名前付き式を使用して集計します。列のグループ化が指定されていない場合、summarizeはストリーム全体を集計します。

search "application"
  | summarize avg(impact) as impact by level interval 1m
>>
{"timestamp": "2019-01-03T00:04:00", "level":"ERROR", "impact": 2}
{"timestamp": "2019-01-03T00:04:00", "level":"INFO", "impact": 0}
{"timestamp": "2019-01-03T00:05:00", "level":"WARNING", "impact":1}
{"timestamp": "2019-01-03T00:06:00", "level":"ERROR", "impact":4.5}
{"timestamp": "2019-01-03T00:06:00", "level":"INFO", "impact": 0}
intervalはオプションです。
search "application"
  | summarize max(impact)
>>
{"impact": 5}

特殊列

raw
rawは、元のメッセージ全体のテキストを表す特殊な列です。
search "application"
  | select *, command=regex('<([^>]*)>', raw)
  | where command = 'rm'
ts

ログのエントリのタイムスタンプ。

index_ts

収集タイムスタンプ。tsとは対照的です。

コメント

単一行コメントと複数行コメントの両方がサポートされています。次に例を示します。
search "application"
  | count -- this is a single line comment
/* this is a
   multi-line
   comment
*/

識別子

識別子は、問合せで使用可能なすべてのエンティティの名前です。識別子は、現在のログ・ストリームのフィールド、または問合せの開始時に定義されたパラメータを参照できます。識別子の形式は次のとおりです。
name: \$?[a-zA-Z_][a-zA-Z_0-9]*

例: levelapp_severity$level

引用符で囲まれた形式では、名前に特殊記号を使用できます(二重引用符を除く)。
name: "[^"]+"
例: "opc-request-id""-level"

すべてのパラメータ参照は、ドル記号($)で始まります(例: $level)。

リテラル

タイプ
文字列 'hello ',' world \'! '
ワイルドカードのパターン "acc -*"
integer -1, 0, +200
float 1.2、0.0001、1.2e10
配列 [1,2,3,4], []
interval 3 h、2 m
nULL値可能 null

関数

スカラー関数
名前 説明
has(field1) field1が行に存在するかどうかをチェックします(isnull()とは異なります。
isnull(expr1)
concat(expr1, ...)
coalesce(expr1, expr2) expr1nullの場合はexpr2、それ以外の場合はexpr1を戻します。
join(delim1, val1, val2, ...) デリミタjoin(',','a',b') => 'a,b'を使用して複数の値を結合します。
split(delim1, str1) デリミタsplit(',', 'a,b') => ['a', 'b']によって、文字列をサブ文字列に分割します。
array_append(val1, ...) 渡された値から配列を作成します。値は配列またはスカラー値です。
array_count(arr1) 配列の要素の数を返します。
time_format(time, format) 指定された書式に基づいて時間から文字列を生成します。
if(pred, val1, val2) predがtrueの場合はval1を戻し、それ以外の場合はval2を戻します。
集計ファンクション
名前 説明
sum(expr1)
avg(expr1)
min(expr1)
max(expr1)
values(expr1) 値を配列に蓄積します。
count() 行数をカウントします。
count(expr) Nullでないexpr値の数を数えます。
count(distinct(expr)) 個別のexpr値の数を数えます。
percentile(expr, percentile1[, percentile2...] 最も近いランクのパーセンタイル:渡されたパーセンタイルnごとに複数の列を作成します。

システム・パラメータ

prefex query.を含むすべてのパラメータは予約されています。次のパラメータがサポートされています。

名前 タイプ 説明
query.from ISO 8601形式の日時を含む文字列。 '2007 -04-05T14: 30' 問合せウィンドウの開始時間を指定します。
query.lookupfolder パスを含む文字列。 'lookup - ucket/dynamic' 参照CSVファイルを含むオブジェクト・ストレージ・バケットである必要があります。
query.to ISO 8601の日時を含む文字列。 '2007 -04-05T14: 30 +05:00' 問合せウィンドウの終了時間を指定します。

フィルタ処理の例

search "auditd_syscall"
| type='SYSCALL' OR type='PATH' OR type='PROCTITLE' OR type='EXECVE'

明示的な時間ウィンドウの例

set query.from=-30m;
set query.to=now;
 
search audit_authentication

集計の例

search StormEvents
  | isnotempty('EndLocation')
  | summarize count() as event_count by EndLocation
  | top 10 by event_count