tencent cloud

Cloud Log Service

文法規則

ダウンロード
フォーカスモード
フォントサイズ
最終更新日: 2026-10-12 14:32:14
AI翻訳

操作シナリオ

検索分析ステートメントは検索条件とSQLステートメントで構成され、両者は縦線|で区切られます。ログの検索のみが必要で、統計分析が不要な場合は、その中のパイプ記号|およびSQLステートメントを省略できます。
[検索条件] | [SQL ステートメント]
検索条件:ログが一致する必要がある条件を指定し、その条件を満たすログを返します。例えば、status:404を使用して、レスポンスステータスコードが404のアプリケーションリクエストログを検索します。検索条件が空または*の場合は、検索条件がないこと、つまりすべてのログを表します。
SQLステートメント:検索条件に一致するログに対して統計分析を行い、統計分析結果を返します。例えば、status:404 | select count(*) as logCountsを使用して、レスポンスステータスコードが404のログ数を集計します。
注意:
検索はログの単語分割に基づいています。元のログは、単語分割後に検索条件で指定された「語」を含んでいる場合にのみ検索できます。例えば、errorではerrorMessageを検索できません。errorMessage自体が1つの独立した語であり、errorと等しくないためです。このログを検索するには、ワイルドカードerror*を使用する必要があります。単語分割の詳細な説明と例については、単語分割とインデックスを参照してください。

前提条件

検索条件を使用します
全文検索:インデックスの設定時に全文インデックスを有効にしました。
キー値検索:
ログは標準ストレージに保存されます。低頻度ストレージではキー値検索を使用できません。詳細はログストレージの概要を参照してください。
ログを収集する際にフィールドごとにログを抽出しました。つまり、ログの構造化です。
インデックスの設定時に、検索が必要なフィールドに対してキー値インデックスを有効にしました。
SQLステートメントを使用します
ログは標準ストレージに保存されます。低頻度ストレージではSQLを使用した統計分析はサポートされていません。詳細はログストレージの概要を参照してください。
ログを収集する際にフィールドごとにログを抽出しました。つまり、ログの構造化です。
インデックスの設定時に、検索が必要なフィールドに対してキー値インデックスを有効にし、統計を有効にしました。

検索条件の構文

検索条件は
2種類の構文ルール
をサポートします:
CQL:CLS Query Language、CLS専用の検索構文であり、ログ検索のために設計され、使いやすく、使用を推奨します。
Lucene:オープンソースのLucene構文です。この構文はログ検索専用に設計されていないため、特殊記号、大文字と小文字、ワイルドカードなどに多くの制限があり、使用が煩雑で、文法エラーが発生しやすく、使用は推奨されません。
CQL(推奨)
Lucene
CQLとLuceneの比較
構文規則
構文
説明
key:value
キーバリュー検索は、フィールド(key)の値に value が含まれるログを検索します。例えば、level:ERRORです。
value
全文検索は、ログ全文に value が含まれるログを検索します。例えば、ERRORです。
AND
「AND」論理演算子は、大文字と小文字を区別しません。例えば、level:ERROR AND pid:1234です。
OR
「OR」論理演算子は、大文字と小文字を区別しません。例えば、level:ERROR OR level:WARNING level:(ERROR OR WARNING)です。
NOT
「NOT」論理演算子は、大文字と小文字を区別しません。例えば、level:ERROR NOT pid:1234 level:ERROR AND NOT pid:1234です。
()
論理グループ演算子は、論理演算の優先順位を制御します。例えば、level:(ERROR OR WARNING) AND pid:1234です。
注意:
括弧を使用しない場合、ANDの優先順位はORよりも高くなります。
" "
フレーズ検索は、文字列を二重引用符で囲みます。ログには文字列内の各単語が含まれ、かつ各単語の順序が維持されている必要があります。例えば、name:"john Smith"です。
フレーズ検索には論理演算子は存在しません。これは検索文字そのものとして扱われます。例えば、name:"and"です。
' '
フレーズ検索は、文字列を単一引用符で囲みます。この機能は""と同等です。検索フレーズに二重引用符が含まれる場合は、構文エラーを避けるために、そのフレーズを単一引用符で囲むことができます。例えば、body:'user_name:"bob"'です。
*
あいまい検索は、0個、1個、複数の文字に一致します。例えば、host:www.test*.comです。プレフィックスあいまい検索はサポートされていません。
>
範囲演算子は、ある数値より大きいことを示します。例えば、status>400またはstatus:>400です。
>=
範囲演算子は、ある数値以上であることを示します。例えば、status>=400またはstatus:>=400です。
<
範囲演算子は、ある数値より小さいことを示します。例えば、status<400またはstatus:<400です。
<=
範囲演算子は、ある数値以下であることを示します。例えば、status<=400またはstatus:<=400です。
=
範囲演算子は、ある数値と等しいことを示します。例えば、status=400であり、status:400と同等です。
\\
エスケープ記号です。エスケープ後の文字は記号そのものを表します。
検索対象の値にスペース、:、(、)、>、=、<、"、'、*が含まれる場合は、エスケープする必要があります。例えば、body:user_name\\:bobです。
二重引用符を使用してフレーズ検索を行う場合、"および*のみエスケープする必要があります。
一重引用符を使用してフレーズ検索を行う場合、'および*のみエスケープする必要があります。
エスケープされていない*はあいまい検索を表します。
key:*
textタイプのフィールド:フィールド(key)が存在するログを検索します。値が空かどうかは問いません。例えば、url:*です。
long/doubleタイプのフィールド:フィールド(key)が存在し、かつ値が数値であるログを検索します。例えば、response_time:*です。
key:""
textタイプのフィールド:フィールド(key)が存在し、かつ値が空であるログを検索します。値に区切り文字のみが含まれる場合も空と同等です。例えば、url:""です。
long/doubleタイプのフィールド:フィールド値が数値ではないログを検索します。フィールド(key)が存在しない場合も含みます。例えば、response_time:""です。
例
ステートメント
ログの検索元が特定のマシンである場合のログ
__SOURCE__:127.0.0.1 または __SOURCE__:192.168.0.*
特定のファイルをソースとするログの検索
__FILENAME__:"/var/log/access.log"
ERRORを含むログを検索します。
ERROR
検索に失敗したログ(ステータスコードが400を超える場合)
status>400
GETリクエストで失敗した(ステータスコードが400を超える)ログを検索します。
method:GET AND status>400
ERRORまたはWARNINGレベルのログを検索します。
level:(ERROR OR WARNING)
INFOレベル以外のログを検索します。
NOT level:INFO

フレーズ検索

二重引用符または一重引用符で文字列を囲んで検索します。例えば、name:"john Smith"、filepath:"/var/log/access.log"です。引用符で囲まない検索と比較すると、フレーズ検索は、ログに文字列内の各語が含まれていると同時に、語の順序も検索条件と厳密に一致している必要があることを示します。
例えば、以下の2つのログがあり、区切り文字は/です:
#1 filepath:"/var/log/access.log"
#2 filepath:"/log/var/access.log"
filepath:/var/log/access.logを使用して検索すると、上記の2つのログが同時に検索されます。これは、非フレーズ検索では語の順序が問われないためです。
filepath:"/var/log/access.log"を使用して検索する場合、最初のログのみが検索されます。
フレーズ検索の検索条件はより厳格です。長い文字列を検索する場合は、フレーズ検索を使用することをお勧めします。
注意
フレーズ検索ではワイルドカードを使用できます。例えば、filepath:"/var/log/acc*.log"です。ただし、語の先頭でワイルドカードを使用することはできません。例えば、filepath:"/var/log/*cess.log"です。
フレーズ検索のワイルドカードは、条件を満たす128個の語にのみ一致し、これらの128個の語を含むすべてのログを返します。指定する語が正確であるほど、検索結果も正確になります。非フレーズ検索にはこの制限はありません。

あいまい検索

あいまい検索では、語の途中または末尾にワイルドカードを追加する必要があります。*を使用して、0個、1個、複数の文字に一致させることができます。例えば:
IP:192.168.1.*で192.168.1.1、192.168.1.34などを検索できます。
host:www.te*t.comでwww.test.com、www.telt.comなどを検索できます。
注意
*は語の先頭に使用できません。つまり、前方一致あいまい検索はサポートされていません。
long型とdouble型のフィールドでは、*を使用したあいまい検索はサポートされていません。数値範囲を使用して検索できます。例えば、status>400 and status<500です。
前方一致あいまい検索を使用する必要がある場合は、次の方法で代用できます:
分かち書き記号を追加します。例えば、ログがhost:www.test.com、host:m.test.comである場合、フィールドの途中にtestを含むログを検索するには、このフィールドに分かち書き記号.を追加します。これにより、host:testを使用してログを直接検索できます。
SQLのstrpos関数を使用します。例えば、* | select * where strpos(host,'test')>0です。ただし、この方法は検索条件と比較してパフォーマンスが低く、ログデータ量が多すぎるシナリオには適していません。
ワイルドカードはフレーズ検索内でも使用できます。例えば、filepath:"/var/log/acc*.log"です。ただし、語の先頭でワイルドカードを使用することはできません。例えば、filepath:"/var/log/*cess.log"です。また、フレーズ検索内のワイルドカードは、条件を満たす128個の語にのみ一致し、これらの128個の語を含むすべてのログを返します。指定する語が正確であるほど、検索結果も正確になります。非フレーズ検索にはこの制限はありません。
Lucene構文を使用する必要がある場合は、ここで構文ルールを切り替えてください:



構文規則
構文
説明
AND
「AND」論理演算子です。例えば、level:ERROR AND pid:1234です。
OR
「OR」論理演算子です。例えば、level:ERROR OR level:WARNINGです。
NOT
「NOT」論理演算子です。例えば、level:ERROR NOT pid:1234です。
()
グループ演算子は、論理演算の優先順位を制御します。例えば、(ERROR OR WARNING) AND pid:1234です。
:
コロンは、keyフィールドに作用することを示します。つまり、キーバリュー検索です。例えば、level:ERRORです。
""
二重引用符は、フレーズを引用します。ログにはフレーズ内の各単語が含まれ、かつ各単語の順序が維持されている必要があります。例えば、name:"john Smith"です。
*
ワイルドカード検索は、0個、1個、複数の文字に一致します。例えば、host:www.test*.comです。プレフィックスあいまい検索はサポートされていません。
さらに、key:*の方法でフィールド(key)が存在するログを検索できます。これは_exists_:keyと同等です。
?
ワイルドカード検索は、単一の文字に一致します。例えば、host:www.te?t.comです。
*と同様に、プレフィックスあいまい検索はサポートされていません。
>
範囲演算子は、ある数値より大きいことを示します。例えば、status:>400です。
>=
範囲演算子は、ある数値以上であることを示します。例えば、status:>=400です。
<
範囲演算子は、ある数値より小さいことを示します。例えば、status:<400です。
<=
範囲演算子は、ある数値以下であることを示します。例えば、status:<=400です。
TO
「範囲」論理演算子です。例えば、request_time:[0.1 TO 1.0]です。
[]
範囲演算子は、境界値を含む範囲を示します。例えば、age:[20 TO 30]です。
{}
範囲演算子は、境界値を含まない範囲を示します。例えば、age:{20 TO 30}です。
\\
エスケープ記号は、エスケープ後の文字が記号そのものを表します。例えば、url:\\/images\\/favicon.icoです。
エスケープ文字を使用したくない場合は、\\"\\"で囲むことができます。例えば、url:\\"/images/favicon.ico\\"です。ただし、二重引用符内の語句はフレーズとして扱われ、ログにはフレーズ内の各語句が含まれ、かつ各語句の順序が維持されている必要があります。
_exists_
_exists_:keyは、keyが存在するログを返します。例えば、_exists_:userAgentは、userAgentフィールドが存在するログを検索することを表します。
注意
構文は大文字と小文字を区別します。例えば、AND、ORは検索論理演算子を表し、and、orは通常のテキストと見なされます。
複数の検索条件をスペースで接続する場合、「または」論理と見なされます。例えば、warning errorはwarning OR errorと同等です。
検索キーワードに特殊文字が含まれる場合は、エスケープ文字を使用してエスケープする必要があります。特殊文字には+ - && || ! ( ) { } [ ] ^ " ~ * ? : \\が含まれます。
ANDとORの論理演算子を同時に使用する場合は、()を使用して検索条件をグループ化し、論理的な優先順位を明確にしてください。例えば、(ERROR OR WARNING) AND pid:1234です。
例
ステートメント
ログの検索元が特定のマシンである場合のログ
__SOURCE__:127.0.0.1 または __SOURCE__:192.168.0.*
特定のファイルをソースとするログの検索
__FILENAME__:"/var/log/access.log"または__FILENAME__:\\/var\\/log\\/*.log
ERRORを含むログを検索します。
ERROR
検索に失敗したログ(ステータスコードが400を超える場合)
status:>400
GETリクエストで失敗した(ステータスコードが400を超える)ログを検索します。
method:GET AND status:>400
ERRORまたはWARNINGレベルのログを検索します。
level:ERROR OR level:WARNING
INFOレベル以外のログを検索します。
NOT level:INFO
192.168.10.10ホスト上のINFOレベル以外のログを検索します。
__SOURCE__:192.168.10.10 NOT level:INFO
192.168.10.10ホスト上の/var/log/access.logファイルにINFOレベルが含まれていないログを検索します。
(__SOURCE__:192.168.10.10 AND __FILENAME__:"/var/log/access.log") NOT level:INFO
192.168.10.10ホスト上のERRORまたはWARNINGレベルのログを検索します。
__SOURCE__:192.168.10.10 AND (level:ERROR OR level:WARNING)
4XXステータスコードのログを検索します。
status:[400 TO 500}
メタデータ内のコンテナ名がnginxであるログを検索します。
__TAG__.container_name:nginx
メタデータ内のコンテナ名がnginxで、かつリクエスト遅延が1秒を超えるログを検索します。
__TAG__.container_name:nginx AND request_time:>1
messageフィールドを含むログを検索します。
message:* または _exists_:message
messageフィールドを含まないログを検索します。
NOT _exists_:message

あいまい検索

CLSでファジー検索を行うには、語の途中または末尾にワイルドカードを追加する必要があります。*を使用して0個、1個、複数の文字に一致させることができ、?を使用して1個の文字に一致させることができます。例えば:
IP:192.168.1.*で192.168.1.1、192.168.1.34などを検索できます。
host:www.te*t.comでwww.test.com、www.telt.comなどを検索できます。
注意
*または?は語の先頭に使用できません。つまり、前方一致あいまい検索はサポートされていません。
long型とdouble型のフィールドでは、*または?を使用したあいまい検索はサポートされていません。数値範囲を使用して検索できます。例えば、status:[400 TO 500}です。
前方一致あいまい検索を使用する必要がある場合は、次の方法で代用できます:
分かち書き記号を追加します。例えば、ログがhost:www.test.com、host:m.test.comである場合、フィールドの途中にtestを含むログを検索するには、このフィールドに分かち書き記号.を追加します。これにより、host:testを使用してログを直接検索できます。
SQLのLIKE構文を使用します。例えば、* | select * where host like '%test%'です。ただし、この方法は検索条件と比較してパフォーマンスが低く、ログデータ量が多すぎるシナリオには適していません。
CQL構文はLucene構文と比較して使いやすさが大幅に最適化されており、一部のあまり使用されない機能が簡素化されています。主な違いは以下の通りです:
機能
Lucene
CQL
論理演算子
大文字のみをサポートします。例えば、AND NOT ORです。
大文字と小文字の両方をサポートします。例えば、AND、and、NOT、not、OR、orです。
特殊文字のエスケープ
特殊記号のエスケープが必要な場合が多くあります。例えば、/book/user/login/を検索する場合、\\/book\\/user\\/login\\/にエスケープする必要があります。
エスケープが必要な特殊記号は少なく、/book/user/login/ を直接検索できます。
キーワード検索
キーワードにトークンが含まれる場合、トークン間の関係はORです。例えば、区切り文字が/の場合、/book/user/login/の検索はbook OR user OR loginと等価であり、関連しないログが多数検索されます。
キーワードにトークンが含まれる場合、トークン間の関係はANDです。例えば、区切り文字が/の場合、/book/user/login/の検索はbook AND user AND loginと等価であり、検索の習慣に合致します。
フレーズ検索
フレーズ検索ではワイルドカードは使用できません。例えば、"/book/user/log*/"では/book/user/login/および/book/user/logout/は検索されません。
フレーズ検索ではワイルドカードを使用できます。例えば、"/book/user/log*/"では/book/user/login/および/book/user/logout/を検索できます。
数値範囲検索
timeCost:[20 TO 30]形式の構文を使用して検索します。
timeCost>=20 AND timeCost<=30形式の構文を使用して検索します。
フィールドが存在するログ
_exists_:keyを使用して検索します。ここで、keyはフィールド名です。
key:*を使用して検索します。ここで、keyはフィールド名です。

SQL文の構文

構文
説明
テーブルからデータを選択します。デフォルトでは、現在のログトピックから検索条件に一致するデータを取得します。
列名(KEY)にエイリアスを指定します。
集計関数と組み合わせて、1つ以上の列(KEY)に基づいて元データをグループ化して集計します。
指定されたKEYに基づいて結果セットをソートします。
結果セットのデータ行数を制限します。デフォルトは100件で、最大100万件まで制限できます。
クエリで取得した生データをフィルタリングします。
グループ化・集計後のデータをフィルタリングします。WHEREとの違いは、グループ化(GROUP BY)の後、ソート(ORDER BY)の前に適用される点です。一方、WHEREは集計前の生データに適用されます。
複雑な統計分析シーンでは、まず生データに対して一次統計分析を行い、その分析結果に対して二次統計分析を行う必要があります。このとき、1つのSELECT文の中に別のSELECT文をネストする必要があり、このクエリ方法をネストされたサブクエリと呼びます。
SQL関数を使用してログに対してより豊富な分析処理を行います。例えば、IPからの地理情報の解析、時刻形式の変換、文字列の分割・結合、JSONフィールドの抽出、算術演算、一意な値の数の集計などです。
注意:
SQL文は大文字と小文字を区別しません。SELECTはselectと同等です。
SELECTを使用してログトピックからデータを取得する際、デフォルトで最大100行のデータを取得します。より多くのデータを取得する必要がある場合は、LIMIT構文を使用して取得する行数を指定してください。最大100万行まで取得できます。
文字列は必ず一重引用符''で囲む必要があります。記号で囲まれていない文字、または二重引用符""で囲まれた文字は、フィールドまたは列名を表します。例えば、'status'は文字列statusを表し、statusまたは"status"はログフィールドstatusを表します。文字列内に一重引用符'が含まれる場合は、''(二つの一重引用符)を使用して一重引用符そのものを表す必要があります。例えば、'{''version'': ''1.0''}'は元の文字列{'version': '1.0'}を表します。文字列内に二重引用符"が含まれる場合は、特別な処理は不要です。
SELECT内のフィールド名は列名規範に準拠する必要があります。準拠していない場合は、二重引用符""で囲む必要があります。
末尾にセミコロンを付けてSQLの終了を示す必要はありません。
例
ステートメント
GETリクエストで失敗(ステータスコードが400より大きい)したログの件数を統計します。
method:GET AND status:>400 | select count(*) as errorCount
GETリクエストで失敗(ステータスコードが400より大きい)したログの件数を分単位で統計します。
method:GET AND status:>400 | select histogram(__TIMESTAMP__, interval 1 minute) as analytic_time_minute, count(*) as errorCount group by analytic_time_minute limit 1000
リクエスト数が最も多い5つのURLを統計します。
* | select URL, count(*) as log_count group by URL order by log_count desc limit 5
ERRORログの割合を統計します。
* | select round((count_if(upper(Level) = 'ERROR'))*100.0/count(*),2) as "ERRORログ割合(%)"
各プロバイダー(省)ごとのリクエスト数を集計します。
* | select ip_to_province(client_ip) as province , count(*) as PV group by province order by PV desc limit 1000
説明:
より多くのSQL例については、SQL事例を参照してください。

操作手順

1. CLSコンソールにログインします。
2. 左側のナビゲーションバーで、検索分析をクリックしてください。
3. 上部でクエリを実行するログトピックを選択します。
4. 検索分析文の入力モードを選択します。CLSは検索分析文を入力するために2つのモードを提供しています。



インタラクティブモード:マウスで検索条件と統計分析ルールを指定すると、検索分析文が自動的に生成され、利便性が高くなります。
ステートメントモード:検索分析文を直接入力します。構文ルールに準拠する必要があり、柔軟性が高くなります。
5. 検索分析ステートメントを入力し、右側で時間範囲を選択し、検索ボタンをクリックして、検索分析を実行します。
検索分析ステートメントに検索条件のみが含まれる場合:元のログで検索条件に一致するログを表示できます。デフォルトではログ時間の降順で表示されます。
検索分析ステートメントにSQLステートメントが含まれる場合:統計グラフで分析結果を表示できます。また、元のログで検索条件に一致するログを表示できるため、統計結果と元のログを比較分析できます。

ヘルプとサポート

この記事はお役に立ちましたか?

フィードバック