コンテンツに移動
管理ツール

Cloud Logging で新たにサポートされる正規表現の使用に関するヒントとアドバイス

2020年9月29日
https://storage.googleapis.com/gweb-cloudblog-publish/images/004-GBH-ManagementTools.max-1000x1000.png
Google Cloud Japan Team

※この投稿は米国時間 2020 年 9 月 18 日に、Google Cloud blog に投稿されたものの抄訳です。

お客様からよく受ける質問に「これをログ内で検索する方法は?」というものがあり、多くの場合はロギングクエリ言語に加えて正規表現を使いたいというご要望が伴います。Google はこのほど、クエリ言語に正規表現のサポートを追加しました。これにより、ツールやソフトウェアで使用するのと同じ強力な言語セレクタを使ってログ内を検索できるようになりました。

正規表現がサポートされ、共通クエリGoogle ドキュメントに記載されている使用例を活用しても、ペタバイトに及ぶ構造化ログデータや非構造化ログデータを効率的に検索するには技術が求められ、専門家に相談するしか方法がない場合もあります。ロギングのソフトウェア エンジニアリング リードであり、ロギングクエリ言語に正規表現を追加することに尽力した Dan Jacques に話を聞き、ロギングの仕組みに関する背景と、ログ検索のヒントとアドバイスを得ることができました。


Cloud Logging のストレージとクエリの背景について教えてください。

Cloud Logging は膨大な内部時系列データベースにログデータを保存します。ログのようなタイムスタンプ付きのデータの処理向けに最適化されているため、よくあるロギングツールのように、古いログデータをクラウド ストレージにスワップアウトする必要はありません。これは、Google サービス内部のログとモニタリングを強化するデータベース ソフトウェアと同じです。データベースはスケーラビリティを考慮して設計されていて、1 か月あたり 2.5 EB(エクサバイト)にも及ぶログを処理しています。数千人の Google 社員と Google Cloud のお客様が日々の業務でクエリを実行するため、これほどの規模になるのです。


正規表現のサポートをロギングクエリ言語に追加した経験について聞かせてください。

チームに加わるまでに、Google 社員として Google Cloud Platform と Cloud Logging をかなり使用していたので、機能のギャップとして正規表現のサポートが欠けていることに気付いていました。正規表現のサポートを推進することは、私がやるべきことのリストの上位にありました。今年初めに、そのためには何が必要かを詳しく調査する機会に恵まれました。その直後に、私たちチームは正規表現のサポートを実装する作業に取りかかりました。


お客様が抱えている問題のトラブルシューティングを担当する立場から、ロギングクエリをできる限りうまく機能させるためのヒントとベスト プラクティスを教えてください。

Cloud Logging は非常にフレキシブルで、大部分が自由形式のロギング構造となっているため、とても強力で柔軟度の高いクエリ言語です。この方式には明らかな利点があります。それは、幅広いサービスとソースのログデータがスキーマに適合し、シンプルでわかりやすいクエリ表記法を使ってクエリを発行できることです。ただし、汎用であることには、データやクエリパターンごとの最適化が困難であるという欠点が伴います。一般的に、できる限りクエリの範囲を狭めることでパフォーマンスを改善できますが、検索対象のデータ量も限られてしまいます。範囲を狭めてパフォーマンスを上げるための具体的な対策がいくつかあります。

  • 可能であれば「リソースの種類」フィールドと「ログ名」フィールドをクエリに追加する。こうしたフィールドがインデックス登録されると、パフォーマンスの向上に特に効果的です。残りのクエリで特定のログやリソースからのレコードが選択されているだけの場合でも、これらの制約を追加することで、別の場所の検索に時間を費やさないようシステムに指示できます。フィールド エクスプローラの新しい機能は、特定のリソースのドリルダウンに役立ちます。

元の検索: "CONNECTING"

限定された検索:

読み込んでいます...

  • できる限り時間範囲を狭くする。たとえば、1 年ほど前に削除された VM を探しているとします。Google のストレージ システムは時間に最適化されているため、時間範囲を月単位まで限定するとパフォーマンスが格段に改善されます。タイムスタンプの選択は、UI から行えます。タイムスタンプを検索に明示的に追加することもできます。

https://storage.googleapis.com/gweb-cloudblog-publish/images/choose_time_range.max-1300x1300.jpg

上級者向けのヒント: 次のようにタイムスタンプをフィールドに直接貼り付けて、カスタム期間を指定できます。

元の検索: "CONNECTING"

限定された検索:

読み込んでいます...


元の検索: "CONNECTING"

限定された検索:

読み込んでいます...

Cloud Logging における正規表現の使用について、詳しく説明してください。

Google のフィルタ言語はテキストやテキストとして表現された値の検索を得意としますが、場合によっては過度な単純化に陥るため限定性が損なわれることがあります。正規表現を使用できるようになる前は、複雑なパターンを検索するには、その複雑なパターンの相似を接続句と分離句から作成する必要がありました。これはログエントリに対する過剰なクエリ実行や、クエリのパフォーマンス低下につながることが多いです。

現在は正規表現がサポートされ、大文字と小文字を区別した検索、複雑なパターンの照合、さらには単一の「*」文字の部分文字列検索を行えるようになりました。

正規表現で使用される RE2 構文は使いやすく高性能な正規表現言語で、ドキュメントも充実しています。これがクエリのオプションとして提供されることにより、ユーザーは探しているとおりのログデータを自然かつ効率的に表現できます。

たとえば以前は、「User」で始まり「Logged In」または「Logged Out」で終わるテキスト ペイロードを検索するには、次のような部分文字列の表現を使う必要がありました。

読み込んでいます...

このような検索方法では、実際に意図するクエリから大きく逸脱してしまいます。その理由は次のとおりです。

1. 部分文字列の一致に順序指定がないため、「I have Logged In a User」もフィルタの制約と一致する。

2. それぞれの検索語が個別に実行されるため、内部で候補となるログエントリあたり 3 つの一致が見つかるまで実行されることになり、一致に余分な時間がかかる。

3. 部分文字列の一致では、大文字と小文字が区別されない。そのため、たとえば「logged in」を除外する方法はありません。

正規表現なら、次のように除外することが可能です。

読み込んでいます...

このほうがシンプルなうえに、探しているものが正確に選択されます。

当チームは独自のツールを試験運用し、Cloud Logging チームは Cloud Logging を使ってトラブルシューティングを行っていますが、正規表現は非常に便利であると実感しており、お客様にとっても役立つことを願っています。


Cloud Logging の利用を開始する準備はできましたか?

下記の Dan からのヒントで検索の速度が向上することを覚えておいてください。

  • 可能であれば、クエリにリソースの種類とログ名を追加する。

  • 選択する時間範囲は、できる限り狭くする。

  • 探しているデータが特定のフィールドの一部であるとわかっている場合、グローバル検索を使わずに、そのフィールドを検索する。

  • 正規表現を使って、文字列フィールドに対して大文字と小文字が区別される検索や高度なパターン マッチングを実行する。部分文字列とグローバル検索では、大文字と小文字は区別されません。

  • 頻繁にクエリが実行されるデータ フィールドを、インデックス付きフィールド「labels」に追加する。

ぜひログビューアにアクセスして、これらのヒントと新たにサポートされた正規表現をお試しください。


-ソフトウェア エンジニア Dan Jacques

-Google Cloud プロダクト マネージャー Mary Koes

投稿先