このトピックでは、Simple Log Service Processing Language (SPL) 命令について説明します。
パラメータデータ型
次の表に、SPL 命令でサポートされているパラメータのデータ型を示します。
パラメータデータ型 | 説明 |
Bool | パラメータはブール値を指定します。このタイプのパラメータは、SPL 命令のスイッチです。 |
Char | ASCII 文字を指定します。文字は一重引用符 (' ') で囲む必要があります。たとえば、 |
Integer | パラメータは整数値を指定します。 |
String | 文字列値を指定します。一重引用符 ('') で囲む必要があります。たとえば、 |
RegExp | RE2 正規表現を指定します。正規表現は一重引用符 (' ') で囲む必要があります。たとえば、 構文定義については、「構文」をご参照ください。 |
JSONPath | JSON パスを指定します。JSON パスは一重引用符 ('') で囲む必要があります。たとえば、 構文定義については、「JsonPath」をご参照ください。 |
Field | フィールド名を指定します。たとえば、 フィールド名に文字、数字、アンダースコア以外の特殊文字が含まれている場合は、二重引用符 ("") で囲む必要があります。たとえば、 説明 フィールド名の大文字と小文字の区別については、「さまざまなシナリオでの SPL」をご参照ください。 |
FieldPattern | フィールド名、またはフィールド名とワイルドカードの組み合わせを指定します。アスタリスク (*) はワイルドカードとして使用でき、ゼロ個以上の文字に一致します。二重引用符 ("") で囲む必要があります。たとえば、 説明 フィールド名の大文字と小文字の区別については、「さまざまなシナリオでの SPL」をご参照ください。 |
SPLExp | パラメータは SPL 式を指定します。 |
SQLExp | パラメータは SQL 式を指定します。 |
SPL 命令
カテゴリ | 名前 | 説明 |
制御命令 | 名前付きデータセットを定義します。SPL データセットの詳細については、「SPL データセット」をご参照ください。 | |
フィールド処理命令 | 指定されたパターンに一致するフィールドを保持し、指定されたフィールドの名前を変更します。命令の実行中、すべての保持関連の式は名前変更関連の式の前に実行されます。 | |
指定されたパターンに一致するフィールドを削除し、その他すべてのフィールドをそのまま保持します。 | ||
指定されたフィールドの名前を変更し、その他すべてのフィールドをそのまま保持します。 | ||
指定されたフィールドの最初のレベルの JSON オブジェクトを展開し、複数の結果エントリを返します。 | ||
構造化データに対する SQL 計算命令 | SQL 式ベースのデータ計算の結果に基づいてフィールドを作成します。サポートされている SQL 関数の詳細については、「SPL でサポートされている SQL 関数」をご参照ください。 | |
SQL 式ベースのデータ計算の結果に基づいてデータをフィルタリングし、指定された SQL 式に一致するデータを保持します。where 命令でサポートされている SQL 関数の詳細については、「SPL でサポートされている SQL 関数」をご参照ください。 | ||
半構造化データ抽出命令 | 指定されたフィールドから、指定された正規表現のグループに一致する情報を抽出します。 | |
指定されたフィールドから CSV 形式の情報を抽出します。 | ||
指定されたフィールドから最初のレイヤーの JSON 情報を抽出します。 | ||
指定されたフィールドからキーと値のペア情報を抽出します。 | ||
新バージョンのデータ変換 | ログフィールドをカプセル化し、フィールドを JSON 形式でシリアル化し、新しいフィールドにエクスポートします。この命令は、API リクエスト本文の構築など、構造化された送信が必要なシナリオに適用できます。 | |
e_to_metric 関数は、ログを Metricstore に保存できるメトリックに変換します。 | ||
既存の時系列データを処理します(タグの追加、変更、削除など)。 | ||
集約命令 | ログの統計分析に使用されます。SQL の集計関数 ( | |
クエリ結果をソートします。フィールド値または統計結果の昇順 ( | ||
クエリ結果で返されるログ行数を制限するために使用されます。データ量を制御するためのコア命令の 1 つです。 |
制御命令
.let
後続の SPL 式の入力として名前付きデータセットを定義します。SPL データセットの詳細については、「SPL データセット」をご参照ください。
構文
.let <dataset>=<spl-expr>
パラメータ
パラメータ | 型 | 必須 | 説明 |
dataset | String | はい | データセットの名前。名前には文字、数字、アンダースコアを含めることができ、文字で始める必要があります。名前は大文字と小文字が区別されます。 |
spl-expr | SPLExp | はい | データセットを生成するために使用される SPL 式。 |
例
例 1: ステータスコードに基づいてアクセスログをフィルタリングおよび分類し、ログをエクスポートします。
SPL 文
-- SPL 処理結果を src という名前のデータセットとして定義し、後続の SPL 式の入力として使用します。 .let src = * | where status=cast(status as BIGINT); -- 名前付きデータセット src を SPL 式の入力として使用して、status フィールドが 5xx のデータを取得し、SPL 処理結果を err という名前のデータセットとして定義します。データセットはエクスポートしません。 .let err = $src | where status >= 500 | extend msg='ERR'; -- 名前付きデータセット src を SPL 式の入力として使用して、status フィールドが 2xx のデータを取得し、SPL 処理結果を ok という名前のデータセットとして定義します。データセットはエクスポートしません。 .let ok = $src | where status >= 200 and status < 300 | extend msg='OK'; -- 名前付きデータセット err と ok をエクスポートします $err; $ok;
入力データ
# エントリ 1 status: '200' body: 'this is a test' # エントリ 2 status: '500' body: 'internal error' # エントリ 3 status: '404' body: 'not found'
出力
# エントリ 1: データセット err status: '500' body: 'internal error' msg: 'ERR' # エントリ 2: データセット ok status: '200' body: 'this is a test' msg: 'OK'
フィールド処理命令
project
指定されたパターンに一致するフィールドを保持し、指定されたフィールドの名前を変更します。命令の実行中、すべての保持関連式は、名前変更関連式の前に実行されます。
デフォルトでは、__time__ および __time_ns_part__ タイムフィールドは保持され、名前変更または上書きはできません。詳細については、「タイムフィールド」をご参照ください。
構文
| project -wildcard <field-pattern>, <output>=<field>, ...
パラメータ
パラメータ | 型 | 必須 | 説明 |
wildcard | Bool | いいえ | ワイルドカード一致モードを有効にするかどうかを指定します。デフォルトでは、完全一致モードが使用されます。ワイルドカード一致モードを有効にする場合は、このパラメータを設定する必要があります。 |
field-pattern | FieldPattern | はい | 保持するフィールドの名前、またはフィールドとワイルドカードの組み合わせ。一致するすべてのフィールドが処理されます。 |
output | Field | はい | 名前を変更するフィールドの新しい名前。複数のフィールドを同じ名前に変更することはできません。 重要 新しいフィールド名が入力データの既存のフィールド名と同じである場合の値保持ポリシーの詳細については、「古い値と新しい値の保持と上書き」をご参照ください。 |
field | Field | はい | 名前を変更するフィールドの元の名前。
|
例
例 1: フィールドを保持する。
* | project level, err_msg
例 2: フィールドの名前を変更する。
* | project log_level=level, err_msg
例 3: 完全一致する
__tag__:*
フィールドを保持します。* | project "__tag__:*"
project-away
指定されたパターンに一致するフィールドを削除し、その他すべてのフィールドをそのまま保持します。
この命令は、デフォルトで __time__ および __time_ns_part__ タイムフィールドを保持します。詳細については、「タイムフィールド」をご参照ください。
構文
| project-away -wildcard <field-pattern>, ...
パラメータ
パラメータ | 型 | 必須 | 説明 |
wildcard | Bool | いいえ | ワイルドカード一致モードを有効にするかどうかを指定します。デフォルトでは、完全一致モードが使用されます。ワイルドカード一致モードを有効にする場合は、このパラメータを設定する必要があります。 |
field-pattern | FieldPattern | はい | 削除するフィールドの名前、またはフィールドとワイルドカードの組み合わせ。一致するすべてのフィールドが処理されます。 |
project-rename
指定されたフィールドの名前を変更し、その他すべてのフィールドをそのまま保持します。
デフォルトでは、__time__ および __time_ns_part__ タイムフィールドは保持され、名前変更または上書きはできません。詳細については、「タイムフィールド」をご参照ください。
構文
| project-rename <output>=<field>, ...
パラメータ
パラメータ | 型 | 必須 | 説明 |
output | Field | はい | 名前を変更するフィールドの新しい名前。複数のフィールドを同じ名前に変更することはできません。 重要 新しいフィールド名が入力データの既存のフィールド名と同じである場合の値保持ポリシーの詳細については、「古い値と新しい値の保持と上書き」をご参照ください。 |
field | Field | はい | 名前を変更するフィールドの元の名前。
|
例
指定されたフィールドの名前を変更します。
* | project-rename log_level=level, log_err_msg=err_msg
expand-values
指定されたフィールドの第 1 レベルの JSON オブジェクトを展開し、複数の結果エントリを返します。
出力フィールドのデータ型は VARCHAR です。出力フィールド名が入力データの既存のフィールド名と同じである場合の値保持ポリシーの詳細については、「古い値と新しい値の保持と上書き」をご参照ください。
__time__
および__time_ns_part__
時間フィールドに対して操作することはできません。詳細については、「時間フィールド」をご参照ください。新バージョンのデータ変換がサポートされています。さまざまな SPL 使用シナリオの詳細については、「さまざまなシナリオでの SPL」をご参照ください。
構文
| expand-values -path=<path> -limit=<limit> -keep <field> as <output>
パラメータ
パラメータ | 型 | 必須 | 説明 |
path | JSONPath | いいえ | 指定されたフィールドの JSON パス。JSON パスは、展開する情報を識別するために使用されます。 このパラメータはデフォルトで空であり、指定されたフィールドの完全なデータが展開されることを指定します。 |
limit | Integer | いいえ | 指定されたフィールドの JSON オブジェクトを展開した後に取得できるエントリの最大数。値は 1 から 10 までの整数です。デフォルト値は 10 です。 |
keep | Bool | いいえ | 展開操作の実行後、元のフィールドを保持するかどうかを指定します。デフォルトでは、元のフィールドは保持されません。元のフィールドを保持する場合は、このパラメータを設定する必要があります。 |
field | Field | はい | 展開するフィールドの名前。フィールドのデータ型は |
output | Filed | いいえ | 展開操作の実行後に取得される新しいフィールドの名前。このパラメータを設定しない場合、出力データは元のフィールドにエクスポートされます。 次のロジックに基づいて、フィールドの第 1 レベルの JSON オブジェクトを展開できます。 JSON 配列: 要素ごとに配列を展開します。 JSON 辞書: キーと値のペアごとに辞書を展開します。 その他の JSON 型: 元の値を返します。 無効な JSON: |
例
例 1: 配列を展開し、複数の結果エントリを返す。
SPL 文
* | expand-values y
入力データ
x: 'abc' y: '[0,1,2]'
出力データ (3 つのエントリを含む)
# エントリ 1 x: 'abc' y: '0' # エントリ 2 x: 'abc' y: '1' # エントリ 3 x: 'abc' y: '2'
例 2: 辞書を展開し、複数の結果エントリを返す。
SPL 文
* | expand-values y
入力データ
x: 'abc' y: '{"a": 1, "b": 2}'
出力データ (2 つのエントリを含む)
# エントリ 1 x: 'abc' y: '{"a": 1}' # エントリ 2 x: 'abc' y: '{"b": 2}'
例 3: 指定された JSONPath 式に一致するコンテンツを展開し、出力データを新しいフィールドにエクスポートする。
SPL 文
* | expand-values -path='$.body' -keep content as body
入力データ
content: '{"body": [0, {"a": 1, "b": 2}]}'
出力データ (2 つのエントリを含む)
# エントリ 1 content: '{"body": [1, 2]}' body: '0' # エントリ 2 content: '{"body": [1, 2]}' body: '{"a": 1, "b": 2}'
構造化データに対する SQL 計算命令
extend
SQL 式ベースのデータ計算の結果に基づいてフィールドを作成します。サポートされている SQL 関数の詳細については、「SPL でサポートされている SQL 関数」をご参照ください。
構文
| extend <output>=<sql-expr>, ...
パラメータ
パラメータ | 型 | 必須 | 説明 |
output | Field | はい | 作成するフィールドの名前。複数の式の結果を格納するために同じフィールドを作成することはできません。 重要 新しいフィールド名が入力データの既存のフィールド名と同じである場合、新しいフィールドはデータ型と値に基づいて既存のフィールドを上書きします。 |
sql-expr | SQLExpr | はい | データ処理式。 重要 null 値の処理の詳細については、「SPL 式の null 値を処理する」をご参照ください。 |
例
例 1: 計算式を使用する。
* | extend Duration = EndTime - StartTime
例 2: 正規表現を使用する。
* | extend server_protocol_version=regexp_extract(server_protocol, '\d+')
例 3: JSONPath コンテンツを抽出し、フィールドのデータ型を変換します。
SPL 文
* | extend a=json_extract(content, '$.body.a'), b=json_extract(content, '$.body.b') | extend b=cast(b as BIGINT)
入力データ
content: '{"body": {"a": 1, "b": 2}}'
出力
content: '{"body": {"a": 1, "b": 2}}' a: '1' b: 2
where
SQL 式ベースのデータ計算の結果に基づいてデータをフィルタリングし、指定された SQL 式に一致するデータを保持します。where 命令でサポートされている SQL 関数の詳細については、「SPL でサポートされている SQL 関数」をご参照ください。
構文
| where <sql-expr>
パラメータ
パラメータ | 型 | 必須 | 説明 |
sql-expr | SQLExp | はい | SQL 式。この式に一致するデータが保持されます。 重要 SQL 式の null 値の処理の詳細については、「SPL 式の null 値の処理」をご参照ください。 |
例
例 1: フィールドコンテンツに基づいてデータをフィルタリングする。
* | where userId='123'
例 2: フィールド名に基づいてデータに一致する正規表現を使用してデータをフィルタリングする。
* | where regexp_like(server_protocol, '\d+')
例 3: サーバーエラーのすべてのデータに一致するようにフィールドのデータ型を変換する。
* | where cast(status as BIGINT) >= 500
半構造化データ抽出命令
parse-regexp
指定されたフィールドから、指定された正規表現のグループに一致する情報を抽出します。
出力フィールドのデータ型は VARCHAR です。出力フィールド名が、入力データの既存のフィールド名と同じである場合の値保持ポリシーの詳細については、「古い値と新しい値の保持と上書き」をご参照ください。
__time__ および __time_ns_part__ 時間フィールドに対して操作を実行することはできません。詳細については、「時間フィールド」をご参照ください。
構文
| parse-regexp <field>, <pattern> as <output>, ...
パラメーター
パラメーター | 型 | 必須 | 説明 |
field | フィールド | はい | 情報を抽出するフィールドの元の名前。 このフィールドが入力データに含まれており、フィールド値が |
pattern | 正規表現 | はい | 正規表現。RE2 構文がサポートされています。 |
output | フィールド | いいえ | 正規抽出の抽出結果を格納するために使用するフィールドの名前。 |
例
例 1: 探索的マッチモードを使用します。
SPL 文
* | parse-regexp content, '(\S+)' as ip -- ip: 10.0.0.0 フィールドを生成します。 | parse-regexp content, '\S+\s+(\w+)' as method -- method: GET フィールドを生成します。
入力データ
content: '10.0.0.0 GET /index.html 15824 0.043'
出力
content: '10.0.0.0 GET /index.html 15824 0.043' ip: '10.0.0.0' method: 'GET'
例 2: 完全パターンマッチモードを使用し、正規表現で名前のないキャプチャグループを使用します。
SPL 文
* | parse-regexp content, '(\S+)\s+(\w+)' as ip, method
入力データ
content: '10.0.0.0 GET /index.html 15824 0.043'
出力
content: '10.0.0.0 GET /index.html 15824 0.043' ip: '10.0.0.0' method: 'GET'
parse-csv
指定されたフィールドから、指定された正規表現のグループに一致する情報を抽出します。
出力フィールドのデータ型は VARCHAR です。出力フィールド名が、入力データの既存のフィールド名と同じである場合の値保持ポリシーの詳細については、「古い値と新しい値の保持と上書き」をご参照ください。
__time__ および __time_ns_part__ タイムフィールドでは操作できません。詳細については、「時間フィールド」をご参照ください。
構文
| parse-csv -delim=<delim> -quote=<quote> -strict <field> as <output>, ...
パラメーター
パラメーター | 型 | 必須 | 説明 |
delim | String | いいえ | 入力データのデリミター。 1 ~ 3 つの有効な ASCII 文字を指定できます。 エスケープ文字を使用して特殊文字を示すことができます。たとえば、\t はタブ文字、\11 はシリアル番号が 8 進数 11 に対応する ASCII 文字、\x09 はシリアル番号が 16 進数 09 に対応する ASCII 文字です。 複数の文字の組み合わせをデリミタとして使用することもできます (例: デフォルト値:カンマ(,)。 |
quote | Char | いいえ | 入力データの引用符。 単一の有効な ASCII 文字を指定できます。 入力データにデリミターが含まれている場合は、引用符を指定する必要があります。 たとえば、二重引用符 ("")、一重引用符 ('')、または印刷できない文字 (0x01) を指定できます。 デフォルトでは、引用符は使用されません。 重要 このパラメーターは、delim パラメーターを単一の文字に設定した場合にのみ有効になります。 quote パラメーターと delim パラメーターには異なる値を指定する必要があります。 |
strict | Bool | いいえ | 入力データの値の数が、
デフォルト値: False。厳密な解析を有効にする場合は、このパラメータを設定します。 |
field | Field | はい | 解析対象のフィールドの名前。 このフィールドが入力データに含まれており、フィールド値が |
output | Field | はい | 入力データの解析結果を格納するために使用されるフィールドの名前。 |
例
例 1:シンプルモードでデータを照合する。
SPL 文
* | parse-csv content as x, y, z
入力データ
content: 'a,b,c'
出力
content: 'a,b,c' x: 'a' y: 'b' z: 'c'
例 2:二重引用符を引用符として使用して、特殊文字を含むデータを照合する。
SPL 文
* | parse-csv content as ip, time, host
入力データ
content: '192.168.0.100,"10/Jun/2019:11:32:16,127 +0800",example.aliyundoc.com'
出力
content: '192.168.0.100,"10/Jun/2019:11:32:16,127 +0800",example.aliyundoc.com' ip: '192.168.0.100' time: '10/Jun/2019:11:32:16,127 +0800' host: 'example.aliyundoc.com'
例 3:複数の文字の組み合わせをデリミタとして使用する。
SPL 文
* | parse-csv -delim='||' content as time, ip, req
入力データ
content: '05/May/2022:13:30:28||127.0.0.1||POST /put?a=1&b=2'
出力
content: '05/May/2022:13:30:28||127.0.0.1||POST /put?a=1&b=2' time: '05/May/2022:13:30:28' ip: '127.0.0.1' req: 'POST /put?a=1&b=2'
parse-json
指定されたフィールドから最初のレイヤーの JSON 情報を抽出します。
出力フィールドのデータ型は VARCHAR です。出力フィールド名が、入力データの既存のフィールド名と同じである場合の値保持ポリシーの詳細については、「古い値と新しい値の保持と上書き」をご参照ください。
__time__ および __time_ns_part__ 時間フィールドでは操作できません。詳細については、「時間フィールド」をご参照ください。
構文
| parse-json -mode=<mode> -path=<path> -prefix=<prefix> <field>
パラメーター
パラメーター | 型 | 必須 | 説明 |
mode | 文字列 | いいえ | 出力フィールドの名前が入力データの既存のフィールド名と同じ場合に、情報を抽出するために使用されるモード。デフォルト値は overwrite です。 |
path | JSONPath | いいえ | 指定されたフィールド内の JSON パス。JSON パスは、抽出する情報を特定するために使用されます。 デフォルト値は空の文字列です。デフォルト値を使用すると、指定されたフィールドの完全なデータが抽出されます。 |
prefix | 文字列 | いいえ | JSON 構造を展開することによって生成されるフィールドのプレフィックス。デフォルト値は空の文字列です。 |
field | フィールド | はい | 解析するフィールドの名前。 このフィールドが入力データに含まれており、フィールド値が null 以外の値であり、次のいずれかの条件を満たしていることを確認してください。そうでない場合、抽出操作は実行されません。
|
例
例 1:y フィールドからすべてのキーと値を抽出します。
SPL 文
* | parse-json y
入力データ
x: '0' y: '{"a": 1, "b": 2}'
出力
x: '0' y: '{"a": 1, "b": 2}' a: '1' b: '2'
例 2:content フィールドから body キーの値を異なるフィールドとして抽出します。
SPL 文
* | parse-json -path='$.body' content
入力データ
content: '{"body": {"a": 1, "b": 2}}'
出力
content: '{"body": {"a": 1, "b": 2}}' a: '1' b: '2'
例 3:preserve モードで情報を抽出します。既存のフィールドの場合は、元の値を保持します。
SPL 文
* | parse-json -mode='preserve' y
入力データ
a: 'xyz' x: '0' y: '{"a": 1, "b": 2}'
出力
x: '0' y: '{"a": 1, "b": 2}' a: 'xyz' b: '2'
parse-kv
指定されたフィールドから CSV 形式の情報を抽出します。
出力フィールドのデータ型は VARCHAR です。出力フィールド名が、入力データの既存のフィールド名と同じである場合の値保持ポリシーの詳細については、「古い値と新しい値の保持と上書き」をご参照ください。
__time__ および __time_ns_part__ 時間フィールドに対して操作を実行することはできません。詳細については、「時間フィールド」をご参照ください。
構文
デリミタ抽出
指定されたデリミタに基づいてキーと値のペアを抽出します。
| parse-kv -mode=<mode> -prefix=<prefix> -greedy <field>, <delim>, <kv-sep>
正規抽出
指定された正規表現に基づいてキーと値のペアを抽出します。
| parse-kv -regexp -mode=<mode> -prefix=<prefix> <field>, <pattern>
パラメータ
デリミタ抽出
パラメータ | 型 | 必須 | 説明 |
mode | String | いいえ | 出力フィールド名が、入力データの既存のフィールド名と同じである場合、ビジネス要件に基づいて上書きモードを選択できます。 デフォルト値は overwrite です。詳細については、「フィールド抽出チェックと上書きモード」をご参照ください。 |
prefix | String | いいえ | 出力フィールドのプレフィックス。デフォルト値は空の文字列です。 |
greedy | Bool | いいえ | フィールド値の貪欲マッチングを有効にします。
|
field | Field | はい | 解析するフィールドの名前。
|
delim | Char | はい | 異なるキーと値のペア間のデリミタ。1 ~ 5 つの有効な ASCII 文字で構成されます (例:
|
kv-sep | Char | はい | キーと値のペア内のキーと値を接続する文字。1 ~ 5 つの有効な ASCII 文字で構成されます (例:
|
正規抽出
パラメータ | 型 | 必須 | 説明 |
regexp | Bool | はい | 正規抽出モードを有効にするかどうかを指定します。 |
mode | String | いいえ | 出力フィールド名が、入力データの既存のフィールド名と同じである場合、ビジネス要件に基づいて上書きモードを選択できます。 デフォルト値は overwrite です。詳細については、「フィールド抽出チェックと上書きモード」をご参照ください。 |
prefix | String | いいえ | 出力フィールドのプレフィックス。デフォルト値は空の文字列です。 |
field | Field | はい | 情報を抽出するフィールドの元の名前。 このフィールドが入力データに含まれており、フィールド値が |
pattern | RegExpr | はい | 2 つのキャプチャグループを含む正規表現。1 つのキャプチャグループはフィールド名を抽出し、もう 1 つのキャプチャグループはフィールド値を抽出します。RE2 正規表現がサポートされています。 |
例
例 1: 複数文字のデリミタを使用して、SLS 時系列データからラベルをデータフィールドとして抽出します
SPL 文
* | parse-kv -prefix='__labels__.' __labels__, '|', '#$#'
入力データ
__name__: 'net_in' __value__: '231461.57374215033' __time_nano__: '1717378679274117026' __labels__: 'cluster#$#sls-etl|hostname#$#iZbp17raa25u0xi4wifopeZ|interface#$#veth02cc91d2|ip#$#192.168.22.238'
出力データ
__name__: 'net_in' __value__: '231461.57374215033' __time_nano__: '1717378679274117026' __labels__: 'cluster#$#sls-etl|hostname#$#iZbp17raa25u0xi4wifopeZ|interface#$#veth02cc91d2|ip#$#192.168.22.238' __labels__.cluster: 'sls-etl' __labels__.hostname: 'iZbp17raa25u0xi4wifopeZ' __labels__.interface: 'veth02cc91d2' __labels__.ip: '192.168.22.238'
例 2: 貪欲マッチングモードを有効にして、アクセスログからキーと値の情報を抽出します。
SPL 文
* | parse-kv -greedy content, ' ', '='
入力データ
content: 'src=127.0.0.1 dst=192.168.0.0 bytes=125 msg=connection refused body=this is test time=2024-05-21T00:00:00'
出力データ
content: 'src=127.0.0.1 dst=192.168.0.0 bytes=125 msg=connection refused body=this is test time=2024-05-21T00:00:00' src: '127.0.0.1' dst: '192.168.0.0' bytes: '125' msg: 'connection refused' body: 'this is test' time: '2024-05-21T00:00:00'
例 3: ペア間およびキーと値間のデリミタが異なる場合に、正規抽出モードを使用してキーと値のペアを抽出します。
SPL 文
* | parse-kv -regexp content, '([^&?]+)(?:=|:)([^&?]+)'
入力データ
content: 'k1=v1&k2=v2?k3:v3' k1: 'xyz'
出力データ
content: 'k1=v1&k2=v2?k3:v3' k1: 'v1' k2: 'v2' k3: 'v3'
例 4: preserve モードで情報を抽出します。既存のフィールドの場合、元の値を保持します。
SPL 文
* | parse-kv -regexp -mode='preserve' content, '([^&?]+)(?:=|:)([^&?]+)'
入力データ
content: 'k1=v1&k2=v2?k3:v3' k1: 'xyz'
出力
content: 'k1=v1&k2=v2?k3:v3' k1: 'xyz' k2: 'v2' k3: 'v3'
新バージョンのデータ変換
対応リージョン
中国 (上海)、中国 (河源)
pack-fields
複数のフィールドをカプセル化し、JSON 形式でシリアル化して、新しいフィールドにエクスポートします。この命令は、API リクエスト本文の構築など、構造化された送信が必要なシナリオに適用できます。
デフォルトでは、データ型が Varchar でないフィールド (
__time__
および__time_ns_part__
を含む) は処理されません。デフォルトでは、ソースデータは保持されません。
構文
| pack-fields -keep -ltrim -include=<include> -exclude=<exclude> as <output>
パラメーター
パラメーター | 型 | 必須 | 説明 |
output | 文字列 | はい | 出力フィールドの名前。フィールド値は JSON 形式です。 |
include | 正規表現 | いいえ | ホワイトリスト。ホワイトリストで指定された正規表現に一致するフィールドがカプセル化されます。デフォルト値: ".*"。ログ内のすべてのフィールドが一致してカプセル化されることを示します。詳細については、「正規表現」をご参照ください。 |
exclude | 正規表現 | いいえ | ブラックリスト。ブラックリストはホワイトリストよりも優先されます。ブラックリストで指定された正規表現に一致するフィールドはカプセル化されません。このパラメーターはデフォルトでは空で、一致が実行されないことを示します。詳細については、「正規表現」をご参照ください。 |
ltrim | 文字列 | いいえ | 出力フィールド名からプレフィックスを削除します。 |
keep | Bool | いいえ | データがカプセル化された後、ソースデータを保持するかどうかを指定します。 True: ソースデータは出力結果に保持されます。 False (デフォルト値): ソースデータは出力結果に保持されません。 |
例
例 1: ログ内のすべてのフィールドを test フィールドにカプセル化します。デフォルトでは、カプセル化された元のフィールドは削除されます。
SPL 文
* | pack-fields -include='\w+' as test
入力データ
test1:123 test2:456 test3:789
出力
test:{"test1": "123", "test2": "456", "test3": "789"}
例 2: ログ内のすべてのフィールドを test フィールドにカプセル化します。カプセル化された元のフィールドは削除しないでください。
SPL 文
* | pack-fields -keep -include='\w+' as test
入力データ
test1:123 test2:456 test3:789
出力
test:{"test1": "123", "test2": "456", "test3": "789"} test1:123 test2:456 test3:789
例 3: test フィールドと abcd フィールドを content フィールドにカプセル化します。カプセル化された元のフィールドは削除しないでください。
SPL 文
* | pack-fields -keep -include='\w+' as test
入力データ
abcd@#%:123 test:456 abcd:789
出力
abcd:789 abcd@#%:123 content:{"test": "456", "abcd": "789"} test:456
例 4: test フィールドと abcd フィールドはカプセル化しません。他のすべてのフィールドを content フィールドにカプセル化します。カプセル化された元のフィールドは削除します。
SPL 文
* | pack-fields -exclude='\w+' as test
入力データ
abcd@#%:123 test:456 abcd:789
出力
abcd:789 content:{"abcd@#%": "123"} test:456
例 5: フィールド値から正規表現に一致するすべてのキーと値のペアを抽出し、キーと値のペアをカプセル化し、キーと値のペアを name フィールドに割り当てます。
SPL 文
* | parse-kv -prefix='k_' -regexp dict, '(\w+):(\w+)' | pack-fields -include='k_.*' -ltrim = 'k_' as name
入力データ
dict: x:123, y:456, z:789
出力
dict:x:123, y:456, z:789 name:{"x": "123", "y": "456", "z": "789"}
log-to-metric
e_to_metric 関数は、ログを Metricstore に格納できるメトリックに変換します。
デフォルトでは、「時系列データ (メトリック)」の要件を満たさないログは無視されます。
元のログデータの時間フィールドの時間単位は自動的に検出されます。次の時間単位がサポートされています: 秒、ミリ秒、マイクロ秒、ナノ秒。
デフォルトでは、ハッシュ書き込みが使用されます。
構文
| log-to-metric -wildcard -format -names=<names> -labels=<labels> -time_field=<time_field>
パラメーター
パラメーター | 型 | 必須 | 説明 |
wildcard | Bool | いいえ |
デフォルトでは、完全一致モードが使用されます。ワイルドカード一致モードを有効にする場合は、このパラメータを設定する必要があります。 |
format | Bool | いいえ | 自動フォーマットを有効にするかどうかを指定します。 デフォルトでは、この機能は無効になっています。データ変換中に無効なラベルデータはスキップされます。 この機能が有効になると、無効なラベルデータがフォーマットされます。ラベル値に |
names | FieldList | はい | メトリック時系列ポイントの生成に使用されるログフィールドのリスト。 入力データのフィールドが、指定された少なくとも 1 つのフィールド名またはフィールド名パターンに一致する場合、そのフィールドに対してメトリック時系列ポイントが生成されます。メトリック名はフィールド名で、メトリック値はフィールド値です。 たとえば、 重要
時系列データのフォーマットの詳細については、「時系列データ (Metric)」をご参照ください。 |
labels | FieldList | いいえ | 時系列ラベルの構築に使用されるログフィールドのリスト。 入力データのフィールドが、指定された少なくとも 1 つのフィールド名またはフィールド名パターンに一致する場合、そのフィールドは時系列ポイントのラベルに追加されます。ラベル名はフィールド名で、ラベル値はフィールド値です。 たとえば、 重要
詳細については、「時系列データ (Metric)」をご参照ください。 |
time_field | 文字列 | いいえ | メトリックのタイム フィールド。デフォルトでは、ログ内の 重要
|
例
例 1: rt フィールドを含むログを時系列データ形式に変換します。
SPL 文
* | log-to-metric -names='["rt"]'
入力データ
__time__: 1614739608 rt: 123
出力
__labels__: __name__:rt __time_nano__:1614739608 __value__:123
例 2: rt フィールドを含むログを時系列データ形式に変換し、host フィールドをラベルとして使用します。
SPL 文
* | log-to-metric -names='["rt"]' -labels='["host"]'
入力データ
__time__: 1614739608 rt: 123 host: myhost
出力
__labels__:host#$#myhost __name__:rt __time_nano__:1614739608 __value__:123
例 3:
rt
フィールドとqps
フィールドを含むログを時系列データ形式に変換し、host フィールドをラベルとして使用します。SPL 文
* | log-to-metric -names='["rt", "qps"]' -labels='["host"]'
入力データ
__time__: 1614739608 rt: 123 qps: 10 host: myhost
出力
__labels__:host#$#myhost __name__:rt __time_nano__:1614739608 __value__:123 __labels__:host#$#myhost __name__:qps __time_nano__:1614739608 __value__:10
例 4:あいまい一致を使用して、rt1 フィールドと rt2 フィールドを含むログを時系列データ形式に変換し、host フィールドをラベルとして使用します。
SPL 文
* | log-to-metric -wildcard -names='["rt*"]' -labels='["host"]'
入力データ
__time__: 1614739608 rt1: 123 rt2: 10 host: myhost
出力
__labels__:host#$#myhost __name__:rt1 __time_nano__:1614739608 __value__:123 __labels__:host#$#myhost __name__:rt2 __time_nano__:1614739608 __value__:10
例 5:
rt
フィールドとqps
フィールドを含むログを時系列データ形式に変換し、host
フィールドをラベルとして使用し、ラベル値を自動的にフォーマットします。SPL 文
* | log-to-metric -format -names='["rt", "qps"]' -labels='["host"]'
入力データ
__time__: 1614739608 rt: 123 qps: 10 host: myhost1|myhost2
出力
__labels__:host#$#myhost1_myhost2 __name__:rt __time_nano__:1614739608 __value__:123 __labels__:host#$#myhost1_myhost2 __name__:qps __time_nano__:1614739608 __value__:10
例 6:
rt
フィールドとqps
フィールドを含むログを時系列データ形式に変換し、フィールド名をmax_rt
とtotal_qps
に変更し、host
フィールドをラベルとして使用します。SPL 文
* | project-rename max_rt = rt, total_qps = qps| log-to-metric -names='["max_rt", "total_qps"]' -labels='["host"]'
入力データ
__time__: 1614739608 rt: 123 qps: 10 host: myhost
出力
__labels__:host#$#myhost __name__:max_rt __time_nano__:1614739608 __value__:123 __labels__:host#$#myhost __name__:total_qps __time_nano__:1614739608 __value__:10
例 7:
rt
フィールドとqps
フィールドを含むログを時系列データ形式に変換し、フィールド名を max_rt と total_qps に変更し、host フィールドの名前を hostname に変更してから、ラベルとして使用します。SPL 文
* | project-rename max_rt = rt, total_qps = qps, hostname=host| log-to-metric -names='["max_rt", "total_qps"]' -labels='["hostname"]'
入力データ
__time__: 1614739608 rt: 123 qps: 10 host: myhost
出力
__labels__:hostname#$#myhost __name__:max_rt __time_nano__:1614739608 __value__:123 __labels__:hostname#$#myhost __name__:total_qps __time_nano__:1614739608 __value__:10
例 8:remote_user フィールドを含むログを時系列データ形式に変換し、status フィールドをラベルとして使用し、time フィールドを時系列データのタイムフィールドとして使用し、元のログデータのタイムユニットをナノ秒として指定します。
SPL 文
* | log-to-metric -names='["remote_user"]' -labels='["status"]' -time_field='time'
入力データ
time:1652943594 remote_user:89 request_length:4264 request_method:GET status:200
出力
__labels__:status#$#200 __name__:remote_user __time_nano__:1652943594 __value__:89
metric-to-metric
既存の時系列データを処理します (タグの追加、変更、削除など)。
入力フィールド名は、正規表現
[a-zA-Z_][a-zA-Z0-9_]*
に従う必要があります。そうでない場合、生成される時系列ポイントのラベルには、このフィールドは含まれません。3 つのオプションパラメーターに同じフィールドが含まれている場合、優先順位は add_labels > del_labels > rename_labels です。
出力時系列データのフォーマットについては、「時系列データ (Metric)」をご参照ください。
構文
| metric-to-metric -add_labels=<add_labels> -remove_labels=<remove_labels> -rename_labels=<rename_labels>
パラメーター
パラメーター | 型 | 必須 | 説明 |
add_labels | 配列 | いいえ | 追加するラベルフィールドのリスト。新しい時系列ラベル情報を構築するために使用されます。 生データは時系列ポイントのラベルに追加され、VARCHAR タイプのみがサポートされます。 たとえば、 |
del_labels | 配列 | いいえ | 削除するラベルフィールドのリスト。リストは、新しい時系列ラベルを構築するために使用されます。 入力データのフィールド名が元のラベルのフィールド名と一致する場合、フィールドは元のラベルから削除されます。 たとえば、元のラベルの値が |
rename_labels | マップ | いいえ | 名前を変更するラベルフィールドのリスト。リストは、新しい時系列ラベルを構築するために使用されます。 元の時系列ポイントのラベルは、マップの情報に基づいて更新されます。キーはフィールド名で、値は新しいフィールド名です。 たとえば、 |
format | Bool | いいえ | 自動フォーマットを有効にするかどうかを指定します。デフォルトでは、この機能は無効になっています。データ変換中に無効なデータはスキップされます。 機能が有効になっている場合:
|
例
例 1: ラベルを追加する
SPL 文
* | extend qps = '10'|metric-to-metric -add_labels='["qps"]'
入力データ
__labels__:host#$#myhost __name__:rt __time_nano__:1614739608 __value__:123
出力結果
__labels__:host#$#myhost|qps#$#10 __name__:rt __time_nano__:1614739608 __value__:123
例 2: ラベルを削除する
SPL 文
* | metric-to-metric -del_labels='["qps"]'
入力データ
__labels__:host#$#myhost|qps#$#10 __name__:rt __time_nano__:1614739608 __value__:123
出力結果
__labels__:host#$#myhost __name__:rt __time_nano__:1614739608 __value__:123
例 3: ラベルの名前を変更する
SPL 文
* | metric-to-metric -rename_labels='{"host":"etl_host"}'
入力データ
__labels__:host#$#myhost|qps#$#10 __name__:rt __time_nano__:1614739608 __value__:123
出力結果
__labels__:etl_host#$#myhost|qps#$#10 __name__:rt __time_nano__:1614739608 __value__:123
例 4: 無効なデータをワンクリックでフォーマットする
SPL 文
* | metric-to-metric -format
入力データ
__labels__:host#$#myhost|qps#$#10|asda$cc#$#j|ob|schema#$#|#$#|#$#xxxx __name__:rt __time_nano__:1614739608 __value__:123
出力結果
__labels__:asda_cc#$#j|host#$#myhost|qps#$#10 __name__:rt __time_nano__:1614739608 __value__:123
集約命令
stats
ログの統計分析に使用されます。SQL の集計関数(COUNT
、SUM
、AVG
など)と同様です。ログデータ内の特定のフィールドに対して、統計、グループ化、および集約操作を実行します。
この命令は、Logstore クエリ分析専用であり、新しいバージョンのデータ変換、SPL ルール消費、書き込みプロセッサ、Logtail 構成などのシナリオには適用できません。
デフォルトでは、stats は最初の 100 件の集約結果を返します。さらに多くの結果を返すには、limit 命令と組み合わせて使用します。
構文
| stats <aggregation_function> [by <field>, ...]
パラメータ
パラメータ | タイプ | 必須 | 説明 |
output | String | はい | 統計結果フィールドのエイリアスを指定します。 |
aggOperator | SQLExp | はい | 次の集約関数をサポートしています。
|
group | String | いいえ | 集約ディメンションを指定します。SQL の group by 句のフィールドと同様です。 |
例
ip
pv
例 1:ログエントリの総数をカウントします。SPL 文
* | stats count()
入力データ
# エントリ 1 status: 200 size: 1024 ip: '192.168.1.1' # エントリ 2 status: 404 size: 512 ip: '192.168.1.2' # エントリ 3 status: 200 size: 2048 ip: '192.168.1.1'
出力
count(): 3
accesslog
ip
min/max
例 2:状態コード別にグループ化された統計を計算します。SPL 文
* | stats count() as count, sum(size) as total_size by status
入力データ
# エントリ 1 status: 200 size: 1024 ip: '192.168.1.1' # エントリ 2 status: 404 size: 512 ip: '192.168.1.2' # エントリ 3 status: 200 size: 2048 ip: '192.168.1.1'
出力
# エントリ 1 status: 200 count: 2 total_size: 3072 # エントリ 2 status: 404 count: 1 total_size: 512
pv
例 3:複数のグループ化フィールドで複数の統計を計算します。SPL 文
* | stats count() as count, avg(size) as avg_size, max(size) as max_size by status, ip
入力データ
# エントリ 1 status: 200 size: 1024 ip: '192.168.1.1' # エントリ 2 status: 404 size: 512 ip: '192.168.1.2' # エントリ 3 status: 200 size: 2048 ip: '192.168.1.1'
出力
# エントリ 1 status: 200 ip: '192.168.1.1' count: 2 avg_size: 1536 max_size: 2048 # エントリ 2 status: 404 ip: '192.168.1.2' count: 1 avg_size: 512 max_size: 512
sort
クエリ結果をソートします。フィールド値または統計結果の昇順(asc
)または降順(desc
)ソートをサポートしています。ログ分析で重要なデータの迅速な特定、順序付きレポートの生成に重要なツールです。
この命令は、Logstore クエリ分析専用であり、新しいバージョンのデータ変換、SPL ルール消費、書き込みプロセッサ、Logtail 構成などのシナリオには適用できません。
構文
| sort <field> [asc|desc], ...
パラメータ
パラメータ | タイプ | 必須 | 説明 |
field | String | はい | ソートするフィールドを指定します。以下のフィールドタイプをサポートしています。
|
asc/desc | String | いいえ |
|
例
accesslog
を latencyMs
でソートします。
SPL 文
* | extend latencyMs=cast(latencyMs as bigint) | sort latencyMs desc
入力データ
ip: 192.168.1.1 latencyMs: 10 ip: 192.168.1.1 latencyMs: 20 ip: 192.168.1.2 latencyMs: 15
出力データ
ip: 192.168.1.1 latencyMs: 20 ip: 192.168.1.2 latencyMs: 15 ip: 192.168.1.1 latencyMs: 10
limit
クエリ結果で返されるログ行数を制限するために使用します。データ量を制御するためのコア命令の 1 つです。 limit
により、過度に大きなクエリ結果によって引き起こされるパフォーマンスの問題やリソースの浪費を効果的に防ぐことができます。この命令は、ログ分析やリアルタイムモニタリングなど、さまざまなシナリオに適用できます。
この命令は、Logstore クエリ分析専用であり、新しいバージョンのデータ変換、SPL ルール消費、書き込みプロセッサ、Logtail 構成などのシナリオには適用できません。
sort 命令でソート規則を明示的に定義しない場合、limit 命令の出力結果はランダムな順序になります(ログストレージは自然順序を保証しないため)。
構文
limit (<offset>,) <size>
パラメータ
パラメータ | タイプ | 必須 | 説明 |
offset | Integer | いいえ | 最初の |
size | Integer | はい | 行制限。 |
例
accesslog を latencyMs でソートし、最初のエントリを取得します。
SPL 文
* | extend latencyMs=cast(latencyMs as bigint) | sort latencyMs | limit 1
入力データ
ip: 192.168.1.1 latencyMs: 10 ip: 192.168.1.1 latencyMs: 20 ip: 192.168.1.2 latencyMs: 15
出力データ
ip: 192.168.1.1 latencyMs: 20