|で区切られます。ログの検索のみが必要で、統計分析が不要な場合は、その中のパイプ記号|およびSQLステートメントを省略できます。[検索条件] | [SQL ステートメント]
status:404を使用して、レスポンスステータスコードが404のアプリケーションリクエストログを検索します。検索条件が空または*の場合は、検索条件がないこと、つまりすべてのログを表します。status:404 | select count(*) as logCountsを使用して、レスポンスステータスコードが404のログ数を集計します。構文 | 説明 |
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:"and"です。 |
' ' | フレーズ検索は、文字列を単一引用符で囲みます。この機能は ""と同等です。検索フレーズに二重引用符が含まれる場合は、構文エラーを避けるために、そのフレーズを単一引用符で囲むことができます。例えば、body:'user_name:"bob"'です。 |
* | |
> | 範囲演算子は、ある数値より大きいことを示します。例えば、 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"です。引用符で囲まない検索と比較すると、フレーズ検索は、ログに文字列内の各語が含まれていると同時に、語の順序も検索条件と厳密に一致している必要があることを示します。/です:#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"です。*を使用して、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などを検索できます。*は語の先頭に使用できません。つまり、前方一致あいまい検索はサポートされていません。*を使用したあいまい検索はサポートされていません。数値範囲を使用して検索できます。例えば、status>400 and status<500です。host:www.test.com、host:m.test.comである場合、フィールドの途中にtestを含むログを検索するには、このフィールドに分かち書き記号.を追加します。これにより、host:testを使用してログを直接検索できます。* | select * where strpos(host,'test')>0です。ただし、この方法は検索条件と比較してパフォーマンスが低く、ログデータ量が多すぎるシナリオには適していません。filepath:"/var/log/acc*.log"です。ただし、語の先頭でワイルドカードを使用することはできません。例えば、filepath:"/var/log/*cess.log"です。また、フレーズ検索内のワイルドカードは、条件を満たす128個の語にのみ一致し、これらの128個の語を含むすべてのログを返します。指定する語が正確であるほど、検索結果も正確になります。非フレーズ検索にはこの制限はありません。
構文 | 説明 |
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フィールドが存在するログを検索することを表します。 |
warning errorはwarning OR errorと同等です。+ - && || ! ( ) { } [ ] ^ " ~ * ? : \\が含まれます。()を使用して検索条件をグループ化し、論理的な優先順位を明確にしてください。例えば、(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 |
*を使用して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などを検索できます。*または?は語の先頭に使用できません。つまり、前方一致あいまい検索はサポートされていません。*または?を使用したあいまい検索はサポートされていません。数値範囲を使用して検索できます。例えば、status:[400 TO 500}です。host:www.test.com、host:m.test.comである場合、フィールドの途中にtestを含むログを検索するには、このフィールドに分かち書き記号.を追加します。これにより、host:testを使用してログを直接検索できます。* | select * where host like '%test%'です。ただし、この方法は検索条件と比較してパフォーマンスが低く、ログデータ量が多すぎるシナリオには適していません。機能 | 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はフィールド名です。 |
構文 | 説明 |
テーブルからデータを選択します。デフォルトでは、現在のログトピックから検索条件に一致するデータを取得します。 | |
列名(KEY)にエイリアスを指定します。 | |
集計関数と組み合わせて、1つ以上の列(KEY)に基づいて元データをグループ化して集計します。 | |
指定されたKEYに基づいて結果セットをソートします。 | |
結果セットのデータ行数を制限します。デフォルトは100件で、最大100万件まで制限できます。 | |
クエリで取得した生データをフィルタリングします。 | |
グループ化・集計後のデータをフィルタリングします。WHEREとの違いは、グループ化(GROUP BY)の後、ソート(ORDER BY)の前に適用される点です。一方、WHEREは集計前の生データに適用されます。 | |
複雑な統計分析シーンでは、まず生データに対して一次統計分析を行い、その分析結果に対して二次統計分析を行う必要があります。このとき、1つのSELECT文の中に別のSELECT文をネストする必要があり、このクエリ方法をネストされたサブクエリと呼びます。 | |
SQL関数を使用してログに対してより豊富な分析処理を行います。例えば、IPからの地理情報の解析、時刻形式の変換、文字列の分割・結合、JSONフィールドの抽出、算術演算、一意な値の数の集計などです。 |
SELECTはselectと同等です。SELECTを使用してログトピックからデータを取得する際、デフォルトで最大100行のデータを取得します。より多くのデータを取得する必要がある場合は、LIMIT構文を使用して取得する行数を指定してください。最大100万行まで取得できます。''で囲む必要があります。記号で囲まれていない文字、または二重引用符""で囲まれた文字は、フィールドまたは列名を表します。例えば、'status'は文字列statusを表し、statusまたは"status"はログフィールドstatusを表します。文字列内に一重引用符'が含まれる場合は、''(二つの一重引用符)を使用して一重引用符そのものを表す必要があります。例えば、'{''version'': ''1.0''}'は元の文字列{'version': '1.0'}を表します。文字列内に二重引用符"が含まれる場合は、特別な処理は不要です。SELECT内のフィールド名は列名規範に準拠する必要があります。準拠していない場合は、二重引用符""で囲む必要があります。例 | ステートメント |
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 |

フィードバック