デバッグ ログポイント

アプリケーションをデプロイまたは起動した後、Google Cloud Platform Console で Stackdriver Debugger を開くことができます。Stackdriver Debugger では、サービスを再起動したりサービスの通常の機能を妨げたりせずに、実行中のサービスにロギングを挿入できます。これは、ログ ステートメントを追加したり再デプロイしたりする必要がないので、本番環境での問題をデバッグするのに便利です。

Google Stackdriver Debugger の使用方法については、GCP Console のデバッグをご覧ください。

始める前に

Stackdriver Debugger は、アプリケーションのソースコードへのアクセス権の有無に関係なく使用できます。ソースコードが入手できない場合は、下記のデバッグ ログポイントの追加の、手動でファイル名と行番号を入力する手順をご覧ください。

ソースコードが Google Cloud Repository に格納されている場合、そのソースコードは自動的に [デバッグ] ビューに表示されます。

それ以外の場所(ローカルまたは Git リポジトリなど)に格納されているソースコードにアクセスするには、ソースコードの場所の選択が必要となる場合があります。

ログポイント

ログポイントでは、サービスを再起動したりサービスの通常の機能を妨げたりせずに、実行中のサービスにロギングを挿入できます。いずれかのインスタンスがそのログポイントの場所のコードを実行するたびに、Stackdriver Debugger は、メッセージを記録します。ログ出力はターゲットの環境の適切なログに送信されます。たとえば App Engine では、Stackdriver Logging のリクエストログにログ出力が送信されます。

ログポイントは、作成後 24 時間、または削除されるかサービスが再デプロイされるまで、アクティブな状態が維持されます。

デバッグ ログポイントの追加

Console

Cloud Console からログポイントを追加するには:

  1. 右側のパネルで [Logpoint] タブが選択されていることを確認します。
  2. 左側のパネルで、ログポイントを追加するソースコードを含むファイルを選択します。ファイルの内容がセンターパネルに表示されます。
  3. ログポイントを追加する場所の行番号をクリックします。
  4. [logpoint("")] フィールドの間にメッセージを入力し、追加ボタンをクリックします。{newScore.score} のように、式を中括弧で囲むことにより、その値をロギングできます。

ログポイントのインライン追加


使用可能なソースコードがない場合は、「filename:line」とその他の詳細を [ログポイント] パネルに手動で入力できます。 ログポイントの手動追加

gcloud

コマンドラインからログポイントを追加するには:

gcloud debug logpoints create LOCATION MESSAGE

ここで:

  • LOCATION は、ログポイントを設定するファイルの名前と行です。FILE:LINE の形式で指定します。ここで、FILE はファイル名です。同じ名前の他のファイルと区別するために、ファイル名の前に必要なパス コンポーネントを追加することもできます。デバッグ対象に一意ではないファイル名を指定するのは誤りです。
  • MESSAGE はログに記録するメッセージです。

以下に、score の値を info ログレベル(ログポイントのデフォルトのログレベル)で記録する例を示します。

gcloud debug logpoints create HighScoreService.java:105 \
  "User {name} scored {newScore.score}"

HighScoreService.java executes の行 105 が実行された時点で、name 変数と newScore.score 変数の値が出力文字列に挿入されたメッセージがログに記録されます。

ログポイント メッセージの形式

ログポイントのメッセージにより、出力に何が記録されるかが決まります。式を使用することにより、特定の値を評価してログに記録できます。メッセージの中で、{myObj.myFunc()}{a + b} のように式を中括弧で囲んだものは、出力の中でその式の値に置き換えられます。上の例のメッセージ User {name} scored {newScore.score} は、ログ出力で User user1 scored 99 のように記録されます。

式には次の言語機能を使用できます。

Java

ほとんどの Java 式がサポートされています。たとえば、以下の式がサポートされています。
  • ローカル変数: a == 8
  • 数値およびブール演算子: x + y < 20
  • インスタンスおよび静的フィールド: this.counter == 20this.myObj.isShutdownmyStaticcom.mycompany.MyClass.staticMember
  • 等価演算子による文字列の比較: myString == "abc"
  • 関数の呼び出し。読み取り専用機能のみ使用できます。たとえば、StringBuilder.indexOf() はサポートされていますが、StringBuilder.append() はサポートされていません。
  • 完全修飾型を含む型キャスト: ((com.myprod.ClassImpl) myInterface).internalField

次の言語機能はサポートされていません

  • 数値型(Integer など)のボックス化解除。代わりに myInteger.value を使用してください。

Python

以下を含め、ほとんどの Python 式はサポートされています。
  • ローカル変数とグローバル変数の読み取り。
  • 配列、リスト、スライス、辞書およびオブジェクトからの読み取り。
  • シンプルなメソッドの呼び出し。

次の言語機能はサポートされていません。

  • 新しいオブジェクトを割り当てる関数、または複雑な構文を使用する関数の呼び出し。
  • 式の中での新しいオブジェクトの作成。

Go

以下を含め、ほとんどの Go 式構文がサポートされています。
  • ローカル変数とグローバル変数の読み取り。
  • 配列、スライス、マップ、構造体からの読み取り。

次の言語機能はサポートされていません。

  • インターフェース値からの読み取り。
  • 型変換と複合リテラル。
  • len 以外の関数の呼び出し。

ログポイントの条件

ログポイントの条件は、アプリケーション言語における単純な式であり、それの評価結果が true になる場合にのみログポイントがログに記録されます。ログポイントの条件は、ログポイントが期限切れになるか削除されるまで、いずれかのインスタンスによってその行が実行されるたびに評価されます。

条件は、論理演算子を含めることができる完全なブール式です。

travelAccessory == “Towel”
ultimateAnswer <= 42
travelAccessory == “Towel” && ultimateAnswer <= 42

条件には、式でサポートされているのと同じ言語機能を使用できます。

Console

'if' ステートメントに条件を入力します。

条件のインライン設定

使用可能なソースコードがない場合は、[ログポイント] パネルで条件を指定できます。

gcloud

条件は、logpoints create--condition フラグを使用して表現されます。

gcloud debug logpoints create HighScoreService.java:105 
--condition="newScore.score > 40"
--log-level="warning"
"Suspiciously high score ({newScore.score}) from user {name}"

上記の例では、アプリケーションの行 105 が実行された時点で、ログポイントによって newScore.score の値がチェックされます。値が 40 より大きい場合に、警告メッセージがログに追加されます。

出力の表示

ログポイント出力はターゲット環境の適切なログに送信されます。

App Engine

App Engine アプリで設定されているログポイントは、Stackdriver Logging のリクエストログに出力を送信します。

ログは、ログパネルまたは専用のログビューアで表示できます。

ログパネルのログポイント

Compute Engine

Compute Engine アプリで設定されているログポイントは、通常のログ ステートメントと同じ場所に出力を送信します。たとえば、Python では、デフォルトのロギング モジュールはその出力を stdout に送信しますが、特定のファイルに書き込むように構成することもできます。

これらのログを Stackdriver Logging に転送するように、ロギング エージェントを設定できます。そこから、ログビューアでログを表示できます。

ログポイントを削除する

ログポイントは 24 時間後に非アクティブになってメッセージの記録を停止し、30 日後に自動的に削除されます。手動でログポイントを削除できます。その場合、ログポイントによるログ記録は停止され、後で参照するための履歴からも削除されます。ただし、ログポイントを削除しても、すでに生成されたログメッセージは削除されません。

Console

ログポイントを手動で削除するには、[Logpoint History] パネルのオーバーフロー メニューを使用します。

ログポイントの削除

gcloud

手動でログポイントを削除するには、そのコードの場所の ID または正規表現を使用してログポイントを指定します。

gcloud debug logpoints delete HighScoreService.java:105

Debug target not specified. Using default target: default-1
This command will delete the following logpoints:

LOCATION                   CONDITION            LOG_LEVEL  LOG_MESSAGE_FORMAT                                             ID
HighScoreService.java:105                       INFO       User {name} scored {newScore.score}.                           53aaa3bd8d2d7-b76f-feb5d
HighScoreService.java:105  newScore.score > 40  WARNING    Suspiciously high score ({newScore.score}) from user {name}  53aaa3bsdffd7-b56f-fasfg

Do you want to continue (Y/n)?  Y
Deleted 2 logpoints.
このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...