SPL (SLS 処理言語) を使用して、構造化データの抽出、フィールドの処理、ログのフィルタリングを実行します。Simple Log Service は、多段パイプラインカスケードをサポートしており、SPL 操作を連結して処理結果をエクスポートできます。
SPL 実行モード
SPL は、クエリ対象のすべてのフィールドにインデックスが設定され、分析が有効になっている場合はインデックスモードで実行されます。それ以外の場合は、スキャンモードに切り替わります。詳細については、「スキャンクエリ構文」をご参照ください。
基本構文
スキャンベースクエリは、SPL 構文 をサポートしています。 SPL ステートメントを使用すると、構造化情報の抽出、フィールド操作の実行、読み取られた生データからのデータのフィルタリングを行うことができます。 また、マルチレベルのパイプラインカスケードもサポートしています。 第 1 レベルのパイプラインはインデックスフィルタ条件で、後続のレベルには SPL 命令が続きます。 最終結果は、SPL によって処理されたデータです。
Index-based search statement | <spl-cmd> ... | <spl-cmd> ...ログサンプル
生のフィールド: [R] のラベルが付いている、スキャン検索に適用可能。
インデックスフィールド: [I] のラベルが付いている、インデックス検索に適用可能。
[I] __topic__: nginx-access-log
[I] Status: 200
[I] Host: api.abc.com
[R] Method: PUT
[R] ClientIp: 192.168.1.1
[R] Payload: {"Item": "1122", "UserId": "112233", "Operation": "AddCart"}
[R] BeginTime: 1705029260
[R] EndTime: 1705028561
[R] RT: 87
[R] Uri: /request/path-3/file-1
[R] UserAgent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_5; ar) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4例
SPL ステートメントでは、定数文字列は単一引用符 (') で囲みます。例:
* | where ClientIp = '192.168.1.1'。フィールド名に特殊文字が含まれている場合は、二重引用符 (") で囲みます。例:
* | project-away "user-agent"。
さまざまな条件でフィルタリングする
等価比較
Status: 200 | where ClientIp = '192.168.1.1'大文字と小文字を区別しない検索
__topic__: nginx-access-log | where lower(Method) != 'put'あいまい一致
Status: 200 | where UserAgent like '%Macintosh%'数値比較
デフォルトのフィールドタイプは varchar であることに注意してください。 数値比較を実行する前に、タイプを bigint に変換します。
Status: 200 | where cast(RT as bigint) > 50正規表現一致
# "path-number" を含む URI を検索します Status: 200 | where regexp_like(Uri, 'path-\d+')
新しいフィールドを計算する
JavaScript から WordPress REST API を使用する /* some CSS styles */ JavaScript から WordPress REST API を使用する このガイドでは、JavaScript を使用して WordPress REST API と対話する方法について説明します。WordPress REST API を使用すると、WordPress データにアクセスし、JavaScript アプリケーションで操作できます。 REST API のエンドポイント WordPress REST API には、さまざまなデータタイプにアクセスするためのさまざまなエンドポイントがあります。たとえば、投稿、ページ、ユーザー、メディアなどにアクセスできます。 投稿 ページ ユーザー メディア JavaScript での REST API の使用 JavaScript で REST API を使用するには、fetch API を使用できます。fetch API を使用すると、HTTP リクエストを作成し、REST API からデータを取得できます。 例: fetch('/wp-json/wp/v2/posts') .then(response => response.json()) .then(posts => { // 投稿データを処理する console.log(posts); }); 詳細については、「WordPress REST API」をご参照ください。 注: この例では、/wp-json/wp/v2/posts エンドポイントを使用して、すべての投稿を取得しています。 ```extend 命令 を使用して、既存のフィールドから新しいフィールドを計算します。
正規表現を使用してフィールドを抽出する
# Uri フィールドからファイル番号を抽出します * not Status: 200 | extend fileNumber=regexp_extract(Uri, 'file-(\d+)', 1)JSON からフィールドを抽出する
Status:200 | extend Item = json_extract_scalar(Payload, '$.Item')区切り文字に基づいてフィールドを抽出する
Status:200 | extend urlParam=split_part(Uri, '/', 3)複数のフィールド値から新しいフィールドを計算する
# BeginTime と EndTime に基づいて時間差を計算します Status:200 | extend timeRange = cast(BeginTime as bigint) - cast(EndTime as bigint)
フィールドの保持、削除、名前変更
特定のフィールドのみを保持し、残りを削除する
Status:200 | project Status, Uri特定のフィールドを削除し、残りを保持する
Status:200 | project-away UserAgentフィールドの名前を変更する
Status:200 | project-rename Latency=RT
非構造化データを展開する
JSON 内のすべてのフィールドを展開する
# 空でないペイロードをフィルタリングし、すべての JSON フィールドを展開します __topic__: nginx-access-log | where Payload is not null | parse-json PayloadJSON フィールドを展開し、元のフィールドを破棄する
status:200 | parse-json body | project-away body正規表現を使用して複数のフィールドを抽出する
Status:200 | parse-regexp Uri, 'path-(\d+)/file-(\d+)' as pathIndex, fileIndex
マルチレベルパイプラインカスケード
マルチレベルパイプラインカスケードを使用して、上記のすべての操作を同じ検索ステートメントで順番に実行できます。
Status:200
| where Payload is not null
| parse-json Payload
| project-away Payload
| where Host='api.qzzw.com' and cast(RT as bigint) > 80
| extend timeRange=cast(BeginTime as bigint) - cast(EndTime as bigint)
| where timeRange > 500
| project UserId, Uriインデックスモードとスキャンモード
SPL は、クエリ対象のフィールドにインデックスが設定され、分析が有効になっているかどうかに基づいて、実行モードを自動的に選択します。
|
項目 |
インデックスモード SPL |
スキャンモード SPL |
|
インデックス設定は必要ですか? |
はい。クエリ対象のすべてのフィールドに、分析が有効なフィールドインデックスが必要です。 |
不要です。 重要
最初のパイプ (|) の前のクエリ文にも、インデックスが必要です。 |
|
パフォーマンス |
高い |
中程度 |
|
ランダムページネーションを使用できますか? |
サポートされています。 |
サポートされていません。 |
|
ログヒストグラム |
クエリ結果に基づきます。 |
クエリ結果とスキャン進行状況に基づきます。 |
|
演算子と関数 |
||
|
フィールドタイプ |
すべてのフィールドはテキストとして扱われます。詳細については、「データ型変換」をご参照ください。 |
すべてのフィールドはテキストとして扱われます。詳細については、「データ型変換」をご参照ください。 |
|
結果セットのサイズ |
コンソールまたは SDK で設定可能です。最大 100 件です。 |
次のいずれかの条件が満たされると、スキャンが停止し、結果が返されます。
|
|
料金 |
インデックストラフィックとインデックスストレージに対して課金されます。詳細については、「機能別課金方式の課金項目」をご参照ください。 SPL クエリの実行には追加料金は発生しません。 |
スキャンされたデータ量に対して課金されます。これは、初期インデックスクエリ後にスキャンによって一致したデータです。 |
手順
ログをクエリする前に、ログを収集し、インデックスを作成済みであることを確認してください。インデックスは、効率的な検索のために、1 つ以上の列のログデータをソートします。詳細については、「インデックスの作成」をご参照ください。
コンソール
Simple Log Service コンソールにログインします。Logstore のクエリと分析ページで、クエリを実行します。詳細については、「ログクエリと分析のクイックスタート」をご参照ください。
例
1,000 万件の生ログが存在すると仮定します。クエリ Status:200 | where Category like '%xx%' は、Status:200 と where Category like '%xx%' の両方に一致する 1,000 件のログを返します。ヒストグラムには、これらのログの時系列分布が表示されます。
API
GetLogs または GetLogsV2 API を呼び出してログをクエリします。GetLogs は非圧縮の結果を返し、GetLogsV2 は圧縮された結果を返します。