基本構文
各クエリステートメントは、検索ステートメントと分析ステートメントで構成されます。 検索文と分析文は縦棒 (|
) で区切られています。 形式:
Search statement|Analytic statement
検索文は独立して実行できます。 分析ステートメントは、検索ステートメントと一緒に実行する必要があります。 ログ分析機能は、検索結果のデータまたはLogstoreのすべてのデータを分析するために使用されます。
ステートメント | 説明 |
検索文 | 検索文は、1つ以上の検索条件を指定する。 検索ステートメントには、キーワード、数値、数値範囲、スペース、またはアスタリスク (*) を使用できます。 検索文としてスペースまたはアスタリスク (*) を指定した場合、検索に条件は使用されず、すべてのログが返されます。 |
分析ステートメント | 分析ステートメントは、検索結果のデータまたはLogstoreのすべてのデータを集計または分析するために使用されます。 Simple Log Serviceでサポートされているログ分析用の機能と構文の詳細については、以下のトピックを参照してください。 |
サンプルクエリ文:
* | SELECT status, count(*) AS PV GROUP BY status
説明
このトピックの検索例で、生ログの詳細については、「デバッグ」をご参照ください。
検索文の作成プロセス
クエリ文を作成するには、次の手順を実行します。
ステップ1: 検索タイプを選択する
重要
Logstoreのログを照会する前に、インデックスを作成する必要があります。 特定のフィールドを分析する場合は、フィールドインデックスを作成し、SELECTステートメントを使用する必要があります。 フィールドインデックスとフルテキストインデックスの作成方法の詳細については、「インデックスの作成」をご参照ください。
クエリと分析の結果は、インデックスの構成によって異なります。 フルテキストインデックスとフィールドインデックスを作成する場合、フィールドインデックスが優先されます。
検索は、インデックスタイプに基づいて、全文検索とフィールド固有検索に分類されます。 次のリストは、フルテキスト検索とフィールド固有の検索の違いを示しています。
フルテキスト検索
フルテキスト検索構文を使用して、特定のフィールドのデータをクエリすることはできません。 フルテキスト検索構文:keywords1 [ [ and | or | not ] keywords2 ] ...
.
keywords1
は、データのクエリに使用するキーワードを指定します。 アスタリスク (*
) と疑問符 (?
) を使用して、ファジーマッチを実行することもできます。 クエリ条件を組み合わせるには、and
or
などの演算子を使用できます。
フィールド固有の検索
フィールド固有の検索構文を使用して、特定のフィールドのデータをクエリできます。 フィールドには、text、long、double、またはjsonタイプを指定できます。 フィールド固有の検索構文:
indexname1 [ : | > | >= | < | <= | = | = | in ] keyword1 [ [ and | or | not ] indexname2 ... ]
重要
indexname1
は、データをクエリするフィールドの名前を指定します。 フィールド名やテーブル名などの固有名詞に、スペースや漢字などの特殊文字、またはand
やor
などの構文キーワードが含まれている場合は、固有名詞を二重引用符 (""
) で囲む必要があります。 詳細については、「」をご参照ください。クエリ文で引用符を使用するにはどうすればよいですか。
long
型またはdouble
型のフィールドにインデックスが作成されている場合は、>
、>=
、<
、<=
、=
、in
の比較演算子を使用できます。
例 1
request_method
フィールド値がGET
であるクエリログ。 検索構文: request_method: GET
例 2
request_time_msec
フィールド値が50
より大きいクエリログ。 検索構文: request_time_msec>50
。 request_time_msecフィールドは、doubleタイプである。
例 3
request_method
フィールド値がGET
であり、request_time_msec
フィールド値が50
より大きいクエリログ。 検索構文: request_method: GET and request_time_msec>50
ステップ2: フィールドデータ型を選択する
検索文を作成するときは、フィールドデータ型の特性をメモし、必要な演算子を使用します。 このようにして、文を使用して効率的かつ正確な方法でログを取得できます。
フィールドデータ型
フィールドデータ型 | 説明 | サポートされる演算子 |
テキスト | 関連フィールドのデータ型をテキストに設定することで、文字列型のデータをクエリできます。 既定では、フルテキストインデックスを有効にすると、__time__ フィールドを除くログ内のすべてのフィールドのデータ型がtextに設定されます。 | 、or 、not 、() 、: 、"" 、\ 、* 、?
|
ロングまたはダブル | フィールドのデータ型をlongまたはdoubleに設定した場合にのみ、数値範囲を使用してフィールドの値を照会できます。 フィールドのデータ型をdoubleまたはlongに設定しない場合、または数値範囲の構文が無効な場合、Simple Log Serviceは全文検索を実行し、検索結果が予想される結果と異なる場合があります。 たとえば、owner_id>100 検索文を実行し、owner_id フィールドのデータ型がdoubleまたはlongでない場合、owner_id 、> 、および100 を含むログが返されます。 この例では、より大きい記号 (>) は区切り文字ではありません。 フィールドのデータ型をtextからdoubleまたはlongに変更した場合、等号 (= ) のみを使用してデータをクエリできます。 データをクエリするために、範囲と比較演算子 (たとえば、より大きい (>) およびより小さい (<)) 記号を使用する場合は、データのインデックスを再作成する必要があります。 詳細については、「Logstoreのログの再インデックス」をご参照ください。
| 、or 、not 、() 、> 。 >= 、< 、<= 、= 、およびin 。
|
json | フィールドの値に基づいて、JSONオブジェクトのフィールドのデータ型をlong、double、またはtextに設定し、そのフィールドの分析を有効にすることができます。 | JSONオブジェクトのフィールドのデータ型に基づいて演算子を指定します。 |
演算子
演算子 | 説明 |
:
| この演算子は、key:value形式に基づくフィールド固有の検索に使用されます。 例: request_method:GET フィールド名またはフィールド値にスペース、コロン (:) 、ハイフン (-) などの特殊文字が含まれている場合は、フィールド名またはフィールド値を二重引用符 ("") で囲む必要があります。 例: "file info":apsara |
と
| と 演算子。 例: request_method:GET and status:200
複数の検索キーワードの中に構文キーワードが存在しない場合は、and 演算子を使用して検索キーワードを評価します。 たとえば、GET 200 cn-shanghai はGET and 200 and cn-shanghai と同等です。 |
または
| または 演算子。 例: request_method:GET or status:200
|
ない
| 演算子ではありません 。 例: request_method:GET not status:200 またはnot status:200 |
( )
| この演算子は、括弧 () で囲まれたクエリ条件の優先度を上げるために使用されます。 例: (request_method:GETまたはrequest_method:POST) およびstatus:200 |
""
| この演算子は、構文キーワードを囲むために使用されます。 構文キーワードが二重引用符 ("" ) で囲まれている場合、キーワードは通常の単語に変換されます。 フィールド固有の検索では、二重引用符 ("" ) で囲まれた単語が全体として見なされます。 フィールド名またはフィールド値に、スペース、漢字、コロン (: ) 、ハイフン (- ) などの特殊文字、またはおよび または などの構文キーワードが含まれる場合、フィールド名またはフィールド値を二重引用符 ("" ) で囲む必要があります。 たとえば、"and" は、単語とを含むログを返します。 この場合、演算子ではありません。 Simple Log Serviceは、sort 、asc 、desc 、group by 、avg 、sum 、min 、max 、limit をサポートしています。 これらの演算子をキーワードとして使用する場合は、演算子を二重引用符 ("" ) で囲む必要があります。 データ変換機能またはLogtailプラグインを使用してログを処理する場合、__tag __:__ client_ip__フィールドのキーが共通キーに変換されます。 ログを検索する場合は、検索文で__タグ __:__ client_ip__フィールドの名前を二重引用符 ("" ) で囲む必要があります。 例: "__tag __:__ client_ip__":192.0.2.1 __tag __:__ client_ip__ フィールドは、Simple Log Serviceの予約済みフィールドです。 このフィールドは、ログを収集するホストのIPアドレスを示します。 詳細については、「予約済みフィールド」をご参照ください。
|
\
| エスケープ文字。 この文字は、二重引用符 ("" ) をエスケープするために使用されます。 二重引用符 ("") は、エスケープされた後にのみ自分自身を示すことができます。 たとえば、ログの内容がinstance_id:nginx "01" の場合、instance_id:nginx\"01\" 文を実行してログを検索できます。 |
*
| ワイルドカード文字。0文字以上の文字を一致させるために使用されます。 例: host:www * com 説明 Simple Log Serviceは、すべてのログを検索して、指定された条件に一致する100単語を照会します。 その後、Simple Log Serviceは、クエリ条件に一致する1つ以上の単語を含むログを返します。 |
?
| 1つの文字を一致させるために使用されるワイルドカード文字。 例: host:aliyund?c |
>
| この演算子は、フィールドの値が特定の数値よりも大きいログを照会するために使用されます。 例: request_time>100 |
>=
| この演算子は、フィールドの値が特定の数値以上であるログを照会するために使用されます。 例: request_time>=100 |
<
| この演算子は、フィールドの値が特定の数値より小さいログを照会するために使用されます。 例: request_time<100 |
<=
| この演算子は、フィールドの値が特定の数値以下であるログを照会するために使用されます。 例: request_time<=100 |
=
| この演算子は、フィールドの値が特定の数値に等しいログを照会するために使用されます。 等号 (= ) とコロン (: ) は、double型またはlong型のフィールドに同じ影響を与えます。 たとえば、request_time=100 はrequest_time:100 に相当します。 |
で
| この演算子は、フィールドの値が特定の数値範囲内にあるログを照会するために使用されます。 括弧 [] はクローズ区間を示し、括弧 () はオープン区間を示す。 スペースは、数値範囲内の2つの数値を区切るために使用されます。 例: request_time in [100 200] またはrequest_time in (100 200) |
__source__
| この演算子は、特定のログソースのログを照会するために使用されます。 ワイルドカード文字がサポートされています。 例: __source __: 192.0.2.* 重要 __source__ フィールドは、Simple Log Serviceの予約済みフィールドです。 このフィールドはsourceと省略できます。 カスタムソースフィールドを設定すると、カスタムフィールドはSimple Log Serviceの予約済みソースフィールドと競合します。 カスタムフィールドを検索する場合は、検索文でSourceまたはSOURCEを使用する必要があります。 |
__tag__
| この演算子は、メタデータを使用してログを照会するために使用されます。 例: __tag __:__ receive_time __: 1609837139 |
__topic__
| この演算子は、特定のログトピックのログを照会するために使用されます。 例: __topic __: nginx_access_log |
ステップ3: マッチモードを選択する
キーワードとビジネス要件に基づいて、正確な検索またはあいまい検索を使用できます。 必要なログが返されない場合は、ログを照会したときに結果が返されない場合はどうすればよいですか?
検索タイプ | 説明 | 例 |
正確な検索 | 完全な単語が検索に使用されます。 Simple Log Serviceは、単語分割を使用してログを照会します。 正確な検索では、フレーズを完全に一致させることはできません。 たとえば、abc def 検索文は、abc とdef を含むログを返します。 フレーズabc defは完全に一致することはできません。 abc def フレーズを完全に一致させたい場合は、フレーズ検索を実行するか、LIKE句を使用できます。 詳細については、「フレーズ検索」および「完全一致を使用してログを照会する方法」をご参照ください。 | hos t:example.com : host フィールドの値にexample.com が含まれているログを返します。
PUTおよびcn-shanghai : PUT およびcn-shanghai キーワードを含むログを返します。
* | Select * where http_user_agent like '% like Gecko %' : http_user_agent フィールド値にlike Gecko フレーズが含まれているログを返します。
#"redo_index/1" : redo_index/1 フレーズを含むログを返します。
|
ファジー検索 | あいまい検索を実行するときに、検索文の単語の中央または末尾に、ワイルドカード文字としてアスタリスク (*) または疑問符 (?) を追加できます。 単語の長さは1〜64文字でなければなりません。 単語にワイルドカード文字が含まれている場合、Simple Log Serviceはすべてのログを検索して、その単語と一致する100の単語を照会します。 その後、Simple Log Serviceは1つ以上の単語を含むログを返します。 より正確な単語を指定すると、検索結果はより正確になります。 ファジー検索は、次のメカニズムを使用するサンプルクエリです。 フィールドインデックス機能を有効にし、ログをクエリするフィールドを指定すると、Simple Log Serviceは、フィールドのインデックス付きデータからランダムサンプルを取得し、結果を返します。 Simple Log Serviceはフルテキストスキャンを実行しません。 フルテキストインデックス機能を有効にし、ログを照会するフィールドを指定しない場合、Simple Log Serviceはすべてのフィールドのインデックス付きデータからランダムなサンプルを取得し、結果を返します。 Simple Log Serviceはフルテキストスキャンを実行しません。
| request_time>60およびrequest_method:Ge * : request_time フィールド値が60 より大きく、request_method フィールド値がGe で始まるログを返します。
addr * : すべてのログでaddr で始まる100の単語を照会し、1つ以上の単語を含むログを返します。
host:www.yl * : すべてのログのhost フィールド値でwww.yl で始まる100の単語を照会し、1つ以上の単語を含むログを返します。
詳細については、「」をご参照ください。ファジーマッチを使用してログを照会するにはどうすればよいですか? |
検索文の例
異なるインデックス設定に基づいて異なるログで検索ステートメントを実行すると、ステートメントは異なる結果を返します。 このセクションで提供される例は、次のサンプルログおよびインデックス設定に基づいています。
サンプルログ
NGINXアクセスログがサンプルログとして使用されます。
インデックス設定
検索文を実行する前に、インデックスが設定されていることを確認してください。 詳細については、「インデックスの作成」をご参照ください。 インデックス設定を確認するには、次の手順を実行します。
Logstoreの [クエリと分析] ページで、 を選択します。
検索と分析パネルで、フィールドインデックスが設定されているかどうかを確認します。
一般的な検索例
期待される検索結果 | 検索文 | デバッグ |
成功したGETリクエストを記録するログ (ステータスコード: 200〜299) |
request_method:GET and status in [200 299]
| デバッグ |
GETリクエストを記録し、リクエストのソースリージョンが中国 (杭州) リージョンではないログ |
request_method:GET not region:cn-hangzhou
| なし |
GETリクエストまたはPOSTリクエストを記録するログ |
request_method:GET or request_method:POST
| デバッグ |
GETリクエストを記録しないログ |
| デバッグ |
成功したGETまたはPOSTリクエストを記録するログ |
(request_method:GET or request_method:POST) and status in [200 299]
| デバッグ |
失敗したGETまたはPOST要求を記録するログ |
(request_method:GET or request_method:POST) not status in [200 299]
| デバッグ |
成功したGETリクエスト (ステータスコード: 200〜299) を記録し、リクエスト期間が60秒未満のログ |
request_method:GET and status in [200 299] not request_time>=60
| デバッグ |
リクエスト期間が60秒に等しいログ |
| デバッグ |
| デバッグ |
リクエスト期間が60秒以上で200秒未満のログ |
request_time>=60 and request_time<200
| デバッグ |
| デバッグ |
request_timeフィールドが空であるか、またはフィールド値が無効な番号であるログ |
request_time:* not request_time > -10000000000
説明 request_time:* は、request_time フィールドが存在するかどうかを確認するために使用されます。 この検索文では、アスタリスク (*) はファジー検索を示していません。
| デバッグ |
request_timeフィールドを含み、フィールド値が数値であるログ |
request_time > -1000000000
| デバッグ |
とを含むログと |
説明 この検索文では、とは共通の文字列ですが、演算子ではありません。 | デバッグ |
リクエストメソッドフィールド値がPUTのログ |
重要 リクエストメソッドフィールドの名前にはスペースが含まれます。 検索文では、フィールド名を二重引用符 ("") で囲む必要があります。 | なし |
トピックがHTTPSまたはHTTPのログ |
__topic__:HTTPS or __topic__:HTTP
| なし |
192.0.2.1ホストから収集されたログ |
__tag__:__client_ip__:192.0.2.1
__tag __:__ client_ip__ フィールドは、Simple Log Serviceの予約済みフィールドです。 このフィールドは、ログを収集するホストのIPアドレスを示します。 詳細については、「予約済みフィールド」をご参照ください。
重要 データ変換機能またはLogtailプラグインを使用してログを処理する場合、__tag __:__ client_ip__フィールドのキーが共通キーに変換されます。 ログを検索する場合は、検索文で__タグ __:__ client_ip__フィールドの名前を二重引用符 ("") で囲む必要があります。 例: "__tag __:__ client_ip__":192.0.2.1 | なし |
IPアドレスが192.168.XX.XX と一致するログ |
* | select * from log where key like '192.168.%.%'
詳細については、「LIKE句を使用してファジー一致を実装する」をご参照ください。 | なし |
remote_userフィールドが空でないログ |
| デバッグ |
remote_userフィールドが空のログ |
| デバッグ |
remote_userフィールド値がnullでないログ |
| デバッグ |
remote_userフィールドを含まないログ |
| デバッグ |
remote_userフィールドを含むログ |
| デバッグ |
cityフィールドの値が上海ではないログ |
説明 中国語文字列をクエリする場合は、インデックスを設定するときにInclude Chineseをオンにする必要があります。 詳細については、「インデックスの作成」をご参照ください。 | なし |