Simple Log Serviceは、クエリ条件を指定するために使用できる一連の検索構文を提供します。 指定されたクエリ条件を満たすログが返されます。 複雑なデータ分析と処理には、分析ステートメントでクエリ結果を使用できます。
検索構文構造
構文
各クエリステートメントは、検索ステートメントと分析ステートメントで構成されます。 検索文と分析文は縦棒 (|) で区切られています。 検索文は単独で実行できます。 ただし、分析ステートメントは検索ステートメントと一緒に実行する必要があります。 ログ分析機能を使用して、検索結果のデータを分析できます。 この機能を使用して、Logstore内のすべてのデータを分析することもできます。
分析ステートメントでFROM句またはWHERE句を指定する必要はありません。 デフォルトでは、現在のLogstoreのすべてのデータが分析されます。
セミコロン (;) を分析ステートメントにステートメントターミネータとして追加する必要はありません。
分析ステートメントは大文字と小文字を区別しません。
構文
Search statement|Analytic statement
ステートメント
説明
検索文
検索文は、1つ以上の検索条件を指定する。 条件は、キーワード、数値、数値範囲、空白文字、またはアスタリスク (*) です。
検索文として空白文字またはアスタリスク (*) を指定した場合、条件は指定されず、すべてのログが返されます。 詳細については、「検索構文」をご参照ください。
分析ステートメント
分析ステートメントは、検索結果またはLogstore内のすべてのデータを集計または分析するために使用されます。
例:
* | SELECT status, count(*) AS PV GROUP BY status
文の書き込みプロセス
検索文は、検索タイプに基づいて検索構文を決定し、フィールドのデータタイプに基づいて演算子を指定してから、一致モードを決定する手順で記述できます。
ステップ1: 検索タイプの選択
特定のフィールドを分析する場合は、フィールドインデックスを作成し、SELECTステートメントを使用する必要があります。 フィールドインデックスとフルテキストインデックスの作成方法の詳細については、「インデックスの作成」をご参照ください。
クエリと分析の結果は、インデックスの構成によって異なります。 フルテキストインデックスとフィールドインデックスを作成する場合、フィールドインデックスが優先されます。
Logstoreにフルテキストインデックスのみを作成する場合は、フルテキスト検索構文のみを使用してクエリ条件を指定できます。
Logstoreのフィールドインデックスのみを作成する場合、使用できる検索構文はフィールドのデータ型によって異なります。
Double and long: フィールド固有の検索構文のみを使用してクエリ条件を指定できます。
テキスト: キーワードが関連付けられているフィールドを特定でき、そのフィールドに対してフィールドインデックスが作成されている場合は、フィールド固有の検索構文を使用してクエリ条件を指定することをお勧めします。 キーワードが関連付けられているフィールドを特定できない場合は、全文検索構文を使用することを推奨します。
フルテキスト検索構文を使用しているが、Logstoreにフルテキストインデックスが作成されていない場合、インデックス付きデータがテキスト型であるフィールドからのみデータをクエリできます。
フルテキスト検索構文を使用し、Logstoreにフルテキストインデックスが作成されている場合、すべてのフィールドのデータをクエリできます。 この場合、すべてのフィールドのインデックス付きデータはテキスト型です。
フルテキスト検索構文
フルテキスト検索構文に基づいて特定のフィールドのデータをクエリすることはできません。 フルテキスト検索構文:
keywords1 [ [ and | または | not ] keywords2]
keywords1は、データのクエリに使用するキーワードを指定します。 アスタリスク (*) と疑問符 (?) を使用して、ファジーマッチを実行することもできます。 クエリ条件を組み合わせるには、and orなどの演算子を使用できます。
例1: Nginxキーワードを含むクエリログ。 検索文: Nginx
。
例2: NginxまたはTomcatキーワードを含むログの照会。 検索文: NginxまたはTomcat
フィールド固有の検索構文
フィールド固有の検索構文に基づいて、特定のフィールドのデータをクエリできます。 フィールドには、text
、long
、double
、またはJSON
タイプを指定できます。 フィールド固有の検索構文:
indexname1[:|>|>=|<|<=|=|[in]keyword1[[および]|または|ない]indexname2...]
indexname1は、データをクエリするフィールドの名前を指定します。 フィールド名やテーブル名などの固有名詞に、スペースや漢字などの特殊文字、またはおよびまたはなどの構文キーワードが含まれている場合は、文字またはキーワードを二重引用符 (
""
) で囲む必要があります。 詳細については、「」をご参照ください。クエリ文で引用符を使用するにはどうすればよいですか。long
型またはdouble
型のフィールドにインデックスが作成されている場合は、>
、>=
、<
、<=
、=
、in
の比較演算子を使用できます。
例1: requestMethodフィールド値がGETであるクエリログ。 検索文: requestMethod: GET
例2: requestTimeSpendフィールド値が500 msを超えるクエリログ。 検索文: requestTimeSpend > 500
フィールドのデータ型が長い
。
例3: requestMethodフィールド値がGETであり、requestTimeSpendフィールド値が500ミリ秒より大きいクエリログ。 検索文: requestMethod: GET and requestTimeSpend > 500
手順2: フィールドデータ型の決定
フィールドデータ型
検索文を作成するときは、フィールドデータ型の特性をメモし、必要な演算子を使用します。 このようにして、文を使用して効率的かつ正確な方法でログを取得できます。
既定では、フルテキストインデックスを有効にすると、
__time__
フィールドを除くログ内のすべてのフィールドのデータ型がtextに設定されます。フィールドインデックス作成を有効にした場合、関連フィールドのデータ型はLongまたはDouble、Text、およびJSONになります。
フィールドデータ型 | 説明 | サポートされる演算子 |
関連フィールドのデータ型をテキストに設定することで、文字列型のデータをクエリできます。 既定では、フルテキストインデックスを有効にすると、 | 、 | |
フィールドのデータ型をlongまたはdoubleに設定した場合にのみ、数値範囲を使用してフィールドの値を照会できます。
| 、 | |
フィールドの値に基づいて、JSONオブジェクトのフィールドのデータ型をlong、double、またはtextに設定し、そのフィールドの分析を有効にすることができます。 | JSONオブジェクトのフィールドのデータ型に基づいて演算子を指定します。 |
演算子
in演算子の文字は小文字でなければなりません。 他の演算子は大文字と小文字を区別しません。
Simple Log Serviceは、sort、asc、desc、group by、avg、sum、min、max、limitをサポートしています。 これらの演算子をキーワードとして使用する場合は、演算子を二重引用符 (
""
) で囲む必要があります。次の演算子は、優先度の高い順にリストされます。
コロン (:)
二重引用符 ("")
括弧()
とではない
または
演算子 | 説明 |
: | この演算子は、key:value形式に基づくフィールド固有の検索に使用されます。 例: フィールド名またはフィールド値にスペース、コロン (:) 、ハイフン (-) などの特殊文字が含まれている場合は、フィールド名またはフィールド値を二重引用符 ("") で囲む必要があります。 例: |
および | と演算子。 例: 複数の検索キーワードの中に構文キーワードが存在しない場合は、and演算子を使用して検索キーワードを評価します。 たとえば、 |
または | または演算子。 例: |
not | 演算子ではありません。 例: |
( ) | この演算子は、括弧 () で囲まれたクエリ条件の優先度を上げるために使用されます。 例: |
"" | この演算子は、構文キーワードを囲むために使用されます。 構文キーワードが二重引用符 ("") で囲まれている場合、キーワードは通常の単語に変換されます。 たとえば、 フィールド固有の検索では、二重引用符 ("") で囲まれた単語が全体として見なされます。 |
\ | エスケープ文字。 この文字は、二重引用符 ("") をエスケープするために使用されます。 二重引用符 ("") は、エスケープされた後にのみ自分自身を示すことができます。 たとえば、ログの内容が |
* | ワイルドカード文字。 この文字は、0、1、または複数の文字を一致させるために使用されます。 例: 説明 Simple Log Serviceはすべてのログを検索し、指定した条件に一致する最大100語を取得します。 次に、Simple Log Serviceは、これらの単語を1つ以上含み、クエリ条件に一致するログを返します。 |
? | ワイルドカード文字。 この文字は、単一の文字と一致するために使用されます。 例: |
> | この演算子は、フィールドの値が指定された数値より大きいログを照会するために使用されます。 例: |
>= | この演算子は、フィールドの値が指定された数値以上であるログを照会するために使用されます。 例: |
< | この演算子は、フィールドの値が指定された数値より小さいログを照会するために使用されます。 例: |
<= | この演算子は、フィールドの値が指定された数値以下であるログを照会するために使用されます。 例: |
= | この演算子は、フィールドの値が指定された数値に等しいログを照会するために使用されます。 等号 (=) とコロン (:) は、double型またはlong型のフィールドに同じ効果があります。 たとえば、 |
in | この演算子は、フィールドの値が指定された数値範囲内にあるログを照会するために使用されます。 括弧 [] はクローズ区間を示し、括弧 () はオープン区間を示す。 スペースは、数値範囲内の2つの数値を区切るために使用されます。 例: 重要 in演算子の文字は小文字でなければなりません。 |
__source__ | この演算子は、指定されたログソースのログを照会するために使用されます。 ワイルドカード文字がサポートされています。 例: 重要 __source__ フィールドは、Simple Log Serviceの予約済みフィールドです。 このフィールドはsourceと省略できます。 カスタムソースフィールドを設定すると、カスタムフィールドはSimple Log Serviceの予約済みソースフィールドと競合します。 カスタムフィールドを検索する場合は、検索文でSourceまたはSOURCEを使用する必要があります。 |
__tag__ | この演算子は、メタデータを使用してログを照会するために使用されます。 例: |
__topic__ | この演算子は、指定されたログトピックのログを照会するために使用されます。 例: |
ステップ3: 一致モードを決定する
キーワードとビジネス要件に基づいて、正確な検索またはあいまい検索を使用できます。 必要なログが返されない場合は、ログを照会したときに結果が返されない場合はどうすればよいですか?
検索タイプ | 説明 | 例 |
正確な検索 | 完全な単語が検索に使用されます。 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で始まります。
cn*
regionフィールドの値がcnで始まるログ。
region:cn*
なし
regionフィールドの値にcn * が含まれるログ。
region:"cn*"
説明この検索文では、
cn *
は完全な文字列です。 例:ログの内容が
region:cn *,en
で、区切り文字がコンマ (,) の場合、Simple log Serviceはログの内容をregion
、cn *
、およびen
に分割します。 検索文を使用してログを検索できます。ログの内容が
region:cn * hangzhou
の場合、Simple log Serviceはcn * hangzhou
全体を考慮します。 この場合、検索文を使用してログを検索することはできません。
なし
特定の単語を含むログ。 単語はmoziで始まり、laで終わり、moziとlaの間に1文字が含まれます。
mozi?la
特定の単語を含むログ。 単語はmoで始まり、laで終わり、moとlaの間に0、1、またはそれ以上の文字が含まれます。
mo*la
特定の単語を含むログ。 言葉はmozまたはsaで始まります。
moz* and sa*
regionフィールドの値がhaiで終わるログ。
検索文を使用してログを検索することはできません。 SQL文でLIKE句を使用して、ログを検索できます。 詳細については、「LIKE句を使用してファジー一致を実装する」をご参照ください。
* | select * from log where region like '%hai'
なし
区切り文字ベースの検索
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:Chrome
http_user_agentフィールドの値にLinuxおよびChromeが含まれるログ
http_user_agent:Linux and http_user_agent:Chrome
http_user_agent:"Linux Chrome"
http_user_agentフィールドの値にFirefoxまたはChromeが含まれるログ
http_user_agent:Firefox or http_user_agent:Chrome
request_uriフィールドの値に /request/path-2が含まれるログ
request_uri:/request/path-2
request_uriフィールドの値が /requestで始まり、/file-0を含まないログ
request_uri:/request* not request_uri:/file-0
redo_index/1
フレーズが完全に一致するログ#"redo_index/1"
* | select * from log where key like 'redo_index/1'
説明フレーズ検索を実行するか、LIKE句を使用してフレーズを完全に一致させることができます。 正確な検索を実行すると、
redo_index
や1
などの単語が一致します。なし
特別なシナリオでのクエリ例
検索文
フィールド名またはフィールド値に、スペース、漢字、コロン (:) 、ハイフン (-) などの特殊文字が含まれている場合、またはおよびまたはなどの構文キーワードが含まれている場合は、フィールド名またはフィールド値を二重引用符 ("") で囲む必要があります。
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アドレスを示します。 詳細については、「予約済みフィールド」をご参照ください。
期待されるクエリ結果 | 検索文 | デバッグ |
|
| なし |
192.0.2.1ホストから収集されたログ。 |
| なし |
分析ステートメント
フィールド名やテーブル名などの固有名詞に、スペース、漢字、コロン (:) 、ハイフン (-) などの特殊文字が含まれている場合、またはおよびまたはなどの構文キーワードが含まれている場合は、分析ステートメントで固有名詞を二重引用符 ("") で囲む必要があります。
特定の文字が文字列を表す場合は、単一引用符 ('') を使用して、その文字を分析ステートメントで囲む必要があります。 例えば、
'status'
はステータスの文字列を示し、status
または"status"
はステータスログフィールドを示します。
期待されるクエリ結果 | クエリ文 | デバッグ |
IPアドレスが |
| なし |
詳細については、「」をご参照ください。クエリ文で引用符を使用するにはどうすればよいですか。
関連ドキュメント
分析関数と構文の詳細については、「分析関数と構文」をご参照ください。
トラブルシューティング
ログクエリの例
フィールド値がJSONオブジェクトまたはJSON配列であるJSONログをクエリできます。 クエリと分析の例の詳細については、「JSONログのクエリと分析」および「JSONログのクエリと分析に関するFAQ」をご参照ください。