Simple Log Service は、インデックス構成を必要とせずに指定されたフィールドを使用してログを検索できる、スキャンベースのクエリ機能を提供します。 また、結果のフィルタリング、変換、および解析のための Simple Log Service 処理言語 (SPL) ステートメントもサポートしています。 このトピックでは、スキャンベースクエリの基本的な構文について説明します。
仕組み
スキャンベースの分析リクエストを受信すると、Simple Log Service は次の手順を実行します。
検索ステートメントを実行してログを取得します。
重要第 1 レベルのパイプラインの検索ステートメントは、インデックスベースのクエリに依存しています。 インデックスフィルタリングが不要な場合は、
*を使用します。 たとえば、status:200 | WHERE userId = '123' | extend host=upper(hostname)を実行する前に、statusフィールドのインデックスを作成する必要がありますが、userIdまたはhostnameフィールドのインデックスは作成する必要はありません。検索結果に対して 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 ステートメントの実行は制限されています。 詳細については、「制限事項」をご参照ください。
ランダムなページめくりはサポートされていません。
インデックスベースクエリとスキャンベースクエリの比較
項目 | インデックスベースクエリ | スキャンベースクエリ |
構文 |
|
|
インデックス構成が必要 | はい。 | インデックスベースの検索ステートメントにはインデックスが必要ですが、他のステートメントには必要ありません。 |
分析ステートメントがサポートされている | はい。 | はい。 |
ランダムページネーションがサポートされている | はい。 | いいえ。 ランダムページネーションはサポートされていません。 連続ページネーション (前方または後方) のみが許可されます。 |
ログヒストグラム | 検索ステートメントの結果に基づいて表示されます。 | 検索ステートメントの結果とスキャンの進捗状況に基づいて表示されます。 |
演算子と関数 | 論理演算、数学的計算、およびあいまい検索がサポートされています。 SQL 関数はサポートされていません。 | 詳細については、「SPL 命令」および「SPL でサポートされている SQL 関数」をご参照ください。 |
フィールドタイプ | インデックス構成で指定されている データの型 によって決まります。 | システムは、フィールドにインデックスが構成されているかどうかに関係なく、SPL ステートメントのフィールドの型をテキストと見なします。 詳細については、「データ型の変換」をご参照ください。 |
結果サイズ | 返すログの数は、Simple Log Service コンソールで指定するか、SDK を呼び出すことによって指定できます。 最大数は 100 です。 | 次のいずれかの条件が満たされると、システムは現在のスキャンを停止し、結果を返します。
|
料金 | インデックストラフィックとインデックスストレージに対して課金されます。 詳細については、「機能別課金の課金対象項目」をご参照ください。 | スキャントラフィックに基づいてスキャンに対して課金されます。これは、スキャン後に返されるデータ量に相当します。 システムは、インデックスベースクエリの結果に基づいてログを識別します。 |