Simple Log Serviceプロジェクトでは、ステートメントを実行して、Logstoreに保存されているログを照会できます。 クエリ結果は、独立して使用することも、複雑なデータ分析および処理のための分析ステートメントで使用することもできる。 このトピックでは、クエリステートメントの書き込みプロセスと構文について説明します。
文の書き込みプロセス
クエリ文を作成するには、次の手順を実行します。
検索タイプを選択します。
フィールドデータ型を選択します。
一致モードを選択します。
このトピックのクエリ例の生ログの詳細については、「デバッグ」をご参照ください。
検索タイプの選択
Logstoreのログをクエリするには、まずインデックスを作成する必要があります。 特定のフィールドを分析する場合は、フィールドインデックスを作成し、SELECTステートメントを使用する必要があります。 フィールドインデックスとフルテキストインデックスの作成方法の詳細については、「インデックスの作成」をご参照ください。
クエリと分析の結果は、インデックスの構成によって異なります。 フルテキストインデックスとフィールドインデックスを作成する場合、フィールドインデックスが優先されます。
Simple Log Serviceプロジェクトは、作成するインデックスの種類に基づいて、フルテキスト検索とフィールド固有の検索をサポートしています。 詳細については、「インデックスの作成」をご参照ください。 次のリストは、フルテキスト検索とフィールド固有検索の違いを示しています。
既定では、フルテキストインデックスを有効にすると、
__time__
フィールドを除くログ内のすべてのフィールドのデータ型がtextに設定されます。 詳細については、「フルテキストインデックス」をご参照ください。フィールドインデックスを有効にすると、関連フィールドのデータ型はtext、JSON、long、doubleになります。 詳細は、「フィールドインデックス」をご参照ください。
Logstoreにフルテキストインデックスのみを作成する場合は、フルテキスト検索のみを使用できます。
Logstoreのフィールドインデックスを作成する場合、フィールドタイプに基づいてログを照会できます。
doubleおよびlong: フィールド固有の検索構文のみを使用してクエリ条件を指定できます。
text: キーワードが関連付けられているフィールドを特定でき、そのフィールドに対してフィールドインデックスが作成されている場合は、フィールド固有の検索構文を使用してクエリ条件を指定することをお勧めします。 キーワードが関連付けられているフィールドを特定できない場合は、全文検索構文を使用することを推奨します。
フルテキスト検索構文を使用しているが、Logstoreにフルテキストインデックスが作成されていない場合、インデックス付きデータがテキスト型であるフィールドからのみデータをクエリできます。
フルテキスト検索構文を使用し、Logstoreにフルテキストインデックスが作成されている場合、すべてのフィールドのデータをクエリできます。 この場合、すべてのフィールドのインデックス付きデータはテキスト型です。
フルテキスト検索
フルテキスト検索構文に基づいて特定のフィールドのデータをクエリすることはできません。 フルテキスト検索構文:keywords1 [ [ and | or | not ] keywords2 ] ...
keywords1
は、データのクエリに使用するキーワードを指定します。 アスタリスク (*
) と疑問符 (?
) を使用して、ファジーマッチを実行することもできます。 クエリ条件を組み合わせるには、and
or
などの演算子を使用できます。
例1: GET
キーワードを含むクエリログ。 検索構文: GET
例2: GET
またはPOST
キーワードを含むクエリログ。 検索構文: GETまたはPOST
フィールド固有の検索
フィールド固有の検索構文に基づいて、特定のフィールドのデータをクエリできます。 フィールドには、text、long、double、およびJSONタイプを指定できます。 フィールド固有の検索構文:
indexname1 [ : | > | >= | < | <= | = | = | in ] keyword1 [ [ and | or | not ] indexname2 ... ]
indexname1
は、データをクエリするフィールドの名前を指定します。 フィールド名やテーブル名などの固有名詞に、スペースや漢字などの特殊文字、またはや
やまたは
などの構文キーワードが含まれている場合は、文字またはキーワードを二重引用符 (""
) で囲む必要があります。 詳細については、「」をご参照ください。クエリ文で引用符を使用するにはどうすればよいですか。long
型またはdouble
型のフィールドにインデックスが作成されている場合は、>
、>=
、<
、<=
、=
、in
の比較演算子を使用できます。
例1: request_method
フィールド値がGET
のクエリログ。 検索構文: request_method: GET
例2: request_time_msec
フィールド値が50
より大きいクエリログ。 検索構文: request_time_msec>50。 フィールドのインデックスタイプはdoubleです。
例3: request_method
フィールド値がGET
であり、request_time_msec
フィールド値が50
より大きいクエリログ。 検索構文: request_method: GET and request_time_msec>50
フィールドデータ型の選択
検索文を作成するときは、フィールドデータ型の特性をメモし、必要な演算子を使用します。 このようにして、文を使用して効率的かつ正確な方法でログを取得できます。
フィールドデータ型
フィールドデータ型 | 説明 | サポートされる演算子 |
関連フィールドのデータ型をテキストに設定することで、文字列型のデータをクエリできます。 既定では、フルテキストインデックスを有効にすると、 |
| |
フィールドのデータ型をlongまたはdoubleに設定した場合にのみ、数値範囲を使用してフィールドの値を照会できます。
|
| |
フィールドの値に基づいて、JSONオブジェクトのフィールドのデータ型をlong、double、またはtextに設定し、そのフィールドの分析を有効にすることができます。 | JSONオブジェクトのフィールドのデータ型に基づいて演算子を指定します。 |
演算子
in演算子の文字は小文字でなければなりません。 他の演算子は大文字と小文字を区別しません。
Simple Log Serviceは、
sort
、asc
、desc
、group by
、avg
、sum
、min
、max
、limit
をサポートしています。 これらの演算子をキーワードとして使用する場合は、演算子を二重引用符 (""
) で囲む必要があります。次の演算子は、優先度の高い順にリストされます。
コロン (:)
二重引用符 ("")
括弧()
とではない
または
演算子 | 説明 |
| この演算子は、key:value形式に基づくフィールド固有の検索に使用されます。 例: フィールド名またはフィールド値にスペース、コロン (:) 、ハイフン (-) などの特殊文字が含まれている場合は、フィールド名またはフィールド値を二重引用符 ("") で囲む必要があります。 例: |
|
複数の検索キーワードの中に構文キーワードが存在しない場合は、 |
|
|
| 演算子で |
| この演算子は、括弧 () で囲まれたクエリ条件の優先度を上げるために使用されます。 例: |
| キーワードを通常の文字に変換するには、二重引用符 (
|
| エスケープ文字。 この文字は、二重引用符 ( |
| ワイルドカード文字。 この文字は、0、1、または複数の文字を一致させるために使用されます。 例: 説明 Simple Log Serviceはすべてのログを検索し、指定した条件に一致する最大100語を取得します。 次に、Simple Log Serviceは、これらの単語を1つ以上含み、クエリ条件に一致するログを返します。 |
| ワイルドカード文字。 この文字は、単一の文字と一致するために使用されます。 例: |
| この演算子は、フィールドの値が指定された数値より大きいログを照会するために使用されます。 例: |
| この演算子は、フィールドの値が指定された数値以上であるログを照会するために使用されます。 例: |
| この演算子は、フィールドの値が指定された数値より小さいログを照会するために使用されます。 例: |
| この演算子は、フィールドの値が指定された数値以下であるログを照会するために使用されます。 例: |
| この演算子は、フィールドの値が指定された数値に等しいログを照会するために使用されます。 等号 ( |
| この演算子は、フィールドの値が指定された数値範囲内にあるログを照会するために使用されます。 括弧 [] はクローズ区間を示し、括弧 () はオープン区間を示す。 スペースは、数値範囲内の2つの数値を区切るために使用されます。 例: 重要 in演算子の文字は小文字でなければなりません。 |
| この演算子は、指定されたログソースのログを照会するために使用されます。 ワイルドカード文字がサポートされています。 例: 重要 __source__ フィールドは、Simple Log Serviceの予約済みフィールドです。 このフィールドはsourceと省略できます。 カスタムソースフィールドを設定すると、カスタムフィールドはSimple Log Serviceの予約済みソースフィールドと競合します。 カスタムフィールドを検索する場合は、検索文でSourceまたはSOURCEを使用する必要があります。 |
| この演算子は、メタデータを使用してログを照会するために使用されます。 例: |
| この演算子は、指定されたログトピックのログを照会するために使用されます。 例: |
マッチモードの選択
キーワードとビジネス要件に基づいて、正確な検索またはあいまい検索を使用できます。 必要なログが返されない場合は、ログを照会したときに結果が返されない場合はどうすればよいですか?
検索タイプ | 説明 | 例 |
正確な検索 | 完全な単語が検索に使用されます。 Simple Log Serviceは、単語分割を使用してログを照会します。 正確な検索では、フレーズを完全に一致させることはできません。 たとえば、 |
|
ファジー検索 | あいまい検索を実行するときに、検索文の単語の中央または末尾に、ワイルドカード文字としてアスタリスク (*) または疑問符 (?) を追加できます。 単語の長さは1〜64文字でなければなりません。 単語にワイルドカード文字が含まれている場合、Simple Log Serviceはすべてのログを検索し、その単語に一致する最大100の単語を取得します。 その後、Simple Log Serviceは、これらの単語を1つ以上含むログを返します。 より正確な単語を指定すると、検索結果はより正確になります。 重要
ファジー検索は、次のメカニズムを使用してサンプルに基づいて実行されます。
|
詳細については、「」をご参照ください。ファジーマッチを使用してログを照会するにはどうすればよいですか? |
検索文の例
異なるインデックス設定に基づいて異なるログで検索ステートメントを実行すると、ステートメントは異なる結果を返します。 このセクションで提供される例は、次のサンプルログおよびインデックス設定に基づいています。
サンプルログ
NGINXアクセスログがサンプルログとして使用されます。
インデックス設定
検索文を実行する前に、インデックスが設定されていることを確認してください。 詳細については、「インデックスの作成」をご参照ください。
Logstoreのクエリと分析ページで、右上隅の [インデックス属性] をクリックし、[属性] を選択します。
インデックスが設定されているかどうかを確認します。 次の図は、インデックスが設定されるフィールドを示しています。
一般的な検索例
期待される検索結果 | 検索文 | デバッグ |
成功したGETリクエストを記録するログ (ステータスコード: 200〜299) |
| |
GETリクエストを記録し、リクエストのソースリージョンが中国 (杭州) リージョンではないログ |
| なし |
GETリクエストまたはPOSTリクエストを記録するログ |
| |
GETリクエストを記録しないログ |
| |
成功したGETリクエストまたは成功したPOSTリクエストを記録するログ |
| |
失敗したGETリクエストまたは失敗したPOSTリクエストを記録するログ |
| |
成功したGETリクエスト (ステータスコード: 200〜299) を記録し、リクエスト期間が60秒未満のログ |
| |
リクエスト期間が60秒に等しいログ |
| |
| ||
リクエスト期間が60秒以上で200秒未満のログ |
| |
| ||
request_timeフィールドが空であるか、またはフィールドの値が無効な番号であるログ |
説明
| |
request_timeフィールドを含み、フィールドの値が数値であるログ |
| |
とを含むログと |
説明 この検索文では、とは共通の文字列ですが、演算子ではありません。 | |
リクエストメソッドフィールドの値がPUTのログ |
重要 リクエストメソッドフィールドの名前にはスペースが含まれます。 検索文では、フィールド名を二重引用符 ("") で囲む必要があります。 | なし |
トピックがHTTPSまたはHTTPのログ |
| なし |
192.0.2.1ホストから収集されたログ |
重要 データ変換機能またはLogtailプラグインを使用してログを処理する場合、__tag __:__ client_ip__フィールドのキーが共通キーに変換されます。 ログを検索する場合は、検索文で__タグ __:__ client_ip__フィールドの名前を二重引用符 ("") で囲む必要があります。 例: | なし |
IPアドレスが |
詳細については、「LIKE句を使用してファジー一致を実装する」をご参照ください。 | なし |
remote_userフィールドが空でないログ |
| |
remote_userフィールドが空のログ |
| |
remote_userフィールドの値がnullでないログ |
| |
remote_userフィールドを含まないログ |
| |
remote_userフィールドを含むログ |
| |
cityフィールドの値が上海ではないログ |
説明 中国語文字列をクエリする場合は、インデックスを設定するときにInclude Chineseをオンにする必要があります。 詳細については、「インデックスの作成」をご参照ください。 | なし |
高度な検索例
ファジー検索
期待される検索結果 | 検索文 | デバッグ |
特定の単語を含むログ。 単語はcnで始まります。 |
| |
regionフィールドの値がcnで始まるログ。 |
| なし |
regionフィールドの値にcn * が含まれるログ。 |
説明 この検索文では、
| なし |
特定の単語を含むログ。 単語はmoziで始まり、laで終わり、moziとlaの間に1文字が含まれます。 |
| |
特定の単語を含むログ。 単語はmoで始まり、laで終わり、moとlaの間に0、1、またはそれ以上の文字が含まれます。 |
| |
特定の単語を含むログ。 言葉はmozまたはsaで始まります。 |
| |
regionフィールドの値がhaiで終わるログ。 | 検索文を使用してログを検索することはできません。 SQL文でLIKE句を使用して、ログを検索できます。 詳細については、「LIKE句を使用してファジー一致を実装する」をご参照ください。
| なし |
区切り文字ベースの検索
Simple Log Serviceは、指定した区切り文字に基づいて、ログの内容を複数の単語に分割します。 デフォルトの区切り文字は、'";=()[]{}?@&<>/:\n\t\r
です。 Delimiterを空のままにすると、Simple Log Serviceは各フィールドの値を全体として考慮します。 この場合、完全な文字列を使用するか、あいまい検索を実行することによってのみ、ログを検索できます。 区切り文字の指定方法の詳細については、「インデックスの作成」をご参照ください。
たとえば、http_user_agentフィールドの値は、Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.2 (KHTML, like Gecko) Chrome/192.0.2.0 Safari/537.2
です。
Delimiterを空のままにすると、Simple Log Serviceはフィールド値全体を考慮します。 この場合、
http_user_agent:Chrome
検索文を使用してログを検索することはできません。Delimiterを
, '";=()[]{}?@&<>/:\n\t\r
に設定した場合、Simple Log Serviceはフィールド値をMozilla
、5.0
、Windows
、NT
、6.1
、AppleWebKit
、537.2
、KHTML
、like
に分割します。2.ヤモリ
、クローム
、192.0.2.0
、サファリ
、537
。 この場合、http_user_agent:Chrome
検索文を使用してログを検索できます。
検索キーワードに区切り文字が含まれている場合は、フレーズ検索を実行するか、LIKE句を使用できます。 例:
フレーズ検索:
#"redo_index/1"
詳細については、「フレーズ検索」をご参照ください。LIKE句:
* | select * from log where key like 'redo_index/1'
期待される検索結果 | 検索文 | デバッグ |
http_user_agentフィールドの値にChromeが含まれるログ |
| |
http_user_agentフィールドの値にLinuxおよびChromeが含まれるログ |
| |
| ||
http_user_agentフィールドの値にFirefoxまたはChromeが含まれるログ |
| |
request_uriフィールドの値に /request/path-2が含まれるログ |
| |
request_uriフィールドの値が /requestで始まり、/file-0を含まないログ |
| |
|
説明 フレーズ検索を実行するか、LIKE句を使用してフレーズを完全に一致させることができます。 正確な検索を実行すると、 | なし |
特別なシナリオでのクエリ例
検索文
キーワードを通常の文字に変換するには、二重引用符 (""
) を使用して構文キーワードを囲みます。 フィールド固有の検索では、二重引用符 (""
) 内の単語が全体として考慮されます。
フィールド名またはフィールド値にスペース、漢字、コロン (
:
) 、ハイフン (-
) などの特殊文字が含まれている場合、またはと
または
などの構文キーワードが含まれている場合は、フィールド名またはフィールド値を二重引用符 (""
) で囲む必要があります。 たとえば、"and"
はとを含むログエントリを返します。 この場合、演算子ではありません。Simple Log Serviceは、
sort
、asc
、desc
、group by
、avg
、sum
、min
、max
、limit
をサポートしています。 これらの演算子をキーワードとして使用する場合は、演算子を二重引用符 (""
) で囲む必要があります。データ変換機能またはLogtailプラグインを使用してログを処理する場合、タグフィールドのキーは共通キーに変換されます。 ログを検索する場合は、キーの名前を二重引用符 (
""
) で囲む必要があります。 例:"__tag __:__ client_ip__":192.0.2.1
__tag __:__ client_ip__
フィールドは、Simple Log Serviceの予約済みフィールドです。 このフィールドは、ログを収集するホストのIPアドレスを示します。 詳細については、「予約済みフィールド」をご参照ください。
期待される検索結果 | 検索文 |
|
|
|
|
分析ステートメント
フィールド名やテーブル名などの固有名詞に、スペース、漢字、コロン (
:
) 、ハイフン (-
) などの特殊文字が含まれているか、および
または
などの構文キーワードが含まれている場合は、固有名詞を分析文で二重引用符 ("
) で囲む必要があります。特定の文字が文字列を表す場合は、単一引用符 (
''
) を使用して文字を分析ステートメントで囲む必要があります。 二重引用符 (""
) で囲まれていない文字列は、フィールド名または列名を示します。 たとえば、'status'
はステータス文字列を示し、status
または"status"
はステータスログフィールドを示します。
期待される検索結果 | 検索文 |
IPアドレスが |
|
詳細については、「」をご参照ください。クエリ文で引用符を使用するにはどうすればよいですか。
関連ドキュメント
分析関数と構文の詳細については、「分析関数と構文」をご参照ください。
トラブルシューティング
ログクエリの例
フィールド値がJSONオブジェクトまたはJSON配列であるJSONログをクエリできます。 クエリと分析の例の詳細については、「JSONログのクエリと分析」および「JSONログのクエリと分析に関するFAQ」をご参照ください。