アプリケーション ログの読み取りと書き込み

概要

リクエストがアプリケーションに送信されると、App Engine によってリクエストログが自動的に書き込まれます。リクエストの処理中には、アプリでアプリケーション ログを書き込むこともできます。このページでは、アプリケーションからアプリケーション ログを書き込む方法、Google Cloud コンソールでログを表示する方法、App Engine がリクエストの処理時に書き込むリクエストログ データを理解する方法について説明します。

ログデータをダウンロードする方法については、ログのエクスポートの概要をご覧ください。

リクエストログとアプリケーション ログ

ログデータには、リクエストログとアプリケーション ログの 2 つのカテゴリがあります。リクエストログは、アプリで処理される各リクエストごとに App Engine によって自動的に書き込まれ、プロジェクト ID、HTTP バージョンなどの情報が含まれます。リクエストログのプロパティの完全なリストについては、RequestLogs をご覧ください。リクエストログのフィールドの詳細については、リクエストログ一覧もご覧ください。

各リクエストログには、そのリクエストに関連付けられ、RequestLogs.getAppLogLines() メソッドで返されるアプリケーション ログ(AppLogLine)のリストが含まれます。各アプリログには、ログが書き込まれた時間、ログメッセージ、ログレベルが含まれます。

アプリケーション ログの書き込み

App Engine Java SDK では、デベロッパーは次の重大度レベルをログに記録できます。

  • SEVERE
  • WARNING
  • INFO
  • CONFIG
  • FINE
  • FINER
  • FINEST

ログレベル、INFOWARNINGSEVERE が追加構成なしでログに表示されます。他のレベルのロギングを Java アプリに追加するには、適切なシステム プロパティをプロジェクトの appengine-web.xml ファイルに追加し、必要に応じて logging.properties ファイルを修正して希望するログレベルを設定します。これらのファイルはどちらも、Maven を使用して App Engine Java プロジェクトを作成するときに同時に作成されます。これらのファイルは以下の場所にあります。

Maven プロジェクトのレイアウト

INFOWARNINGSEVERE 以外のログレベルを追加するには、appengine-web.xml ファイルを編集して <appengine-web-app> タグ内に次のように追加します。

    <system-properties>
       <property name="java.util.logging.config.file" value="WEB-INF/logging.properties"/>
    </system-properties>

logging.properties のデフォルトのログレベルは INFO です。アプリのすべてのクラスのデフォルトのログレベルを変更するには、logging.properties レベルを変更します。たとえば、.level = INFO.level = WARNING に変更できます。

アプリケーション コードでは java.util.logging.Logger API を使用してログ メッセージを書き込みます。次の例では Info ログ メッセージを書き込んでいます。

import java.util.logging.Logger;
//...

public class MyClass {

  private static final Logger log = Logger.getLogger(MyClass.class.getName());
  log.info("Your information log message.");
  //....

アプリを実行すると、App Engine によってメッセージが記録され、ログ エクスプローラで利用できるようになります。

Google Cloud コンソールのログ URL の形式

Google Cloud コンソールのログ URL 形式の例については、次のサンプル URL をご覧ください。

https://console.cloud.google.com/logs?filters=request_id:000000db00ff00ff827e493472570001737e73686966746361727331000168656164000100

コンソールでのログの読み取り

スタンダード環境で実行されているアプリによって書き込まれたログを表示するには、ログ エクスプローラを使用します。

一般的な App Engine ログには、以下のサンプルログに示すとおり、Apache の Combined ログ形式のデータが特別な App Engine フィールドとともに含まれます。

192.0.2.0 - test [27/Jun/2014:09:11:47 -0700] "GET / HTTP/1.1" 200 414
"http://www.example.com/index.html"
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36"
"1-dot-calm-sylph-602.appspot.com" ms=195 cpu_ms=42 cpm_usd=0.000046
loading_request=1 instance=00c61b117cfeb66f973d7df1b7f4ae1f064d app_engine_release=

リクエストログ フィールドについて

次の表に、フィールドとその説明を表示順に示します。

フィールドの順番 フィールド名 常に表示 説明
1 Client address クライアント IP アドレス。例: 192.0.2.0
2 RFC 1413 identity × クライアントの RFC 1413 ID。値はほぼ常に文字 - です。
3 User × アプリで Users API が使用され、ユーザーがログインしている場合のみ表示されます。この値は Google アカウントのニックネームの部分です。たとえば、Google アカウントが test@example.com の場合、このフィールドにログインしたニックネームは test です。
4 Timestamp リクエストのタイムスタンプ。例: [27/Jun/2014:09:11:47 -0700]
5 Request querystring リクエストの最初の行。メソッド、パス、HTTP バージョンが含まれます。例: GET / HTTP/1.1
6 HTTP Status Code 返される HTTP ステータス コード。例: 200
7 Response size レスポンスのサイズ(バイト単位)。例: 414
8 Referrer path × リファラーがない場合、ログにはパスではなく - のみが含まれます。リファラーパスの例: "http://www.example.com/index.html"
9 User-agent ウェブサーバーに対してブラウザとオペレーティング システムを通知します。例: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36
10 Hostname クライアントが App Engine アプリケーションの接続に使用するホスト名。例: 1-dot-calm-sylph-602.appspot.com
11 Wallclock time App Engine がリクエストに費やした時間の合計(ミリ秒)。この時間には、クライアントとサーバー間でアプリケーションのインスタンスの実行に費やされた時間は含まれません。例: ms=195
12 CPU milliseconds リクエストの履行に要した CPU 時間(ミリ秒)。これは、1.2 GHz Intel x86 CPU をベースラインとして、CPU で実際にアプリケーション コードを処実行した場合の所要時間をミリ秒単位で表したものです。実際に使用した CPU がベースラインよりも高速の場合、CPU milliseconds は上記で定義した実際のクロック時間よりも大きな値となる可能性があります。例: cpu_ms=42
13 Exit code × リクエストを取得した後に、インスタンスがシャットダウンした場合にのみ表示されます。exit_code=XXX の形式。XXX は、インスタンスがシャットダウンされた理由に対応する 3 桁の数字です。Exit code は Google による問題の発見と修正を主な目的としているため、文書化されません。
14 Estimated cost 非推奨。この例のようなリクエスト 1,000 件の見積り費用(米ドル)。例: cpm_usd=0.000046
15 Queue name × 使用したタスクキューの名前。リクエストがタスクキューで使用された場合のみ表示されます。例: queue_name=default
16 Task name × このリクエストのタスクキューで実行されるタスクの名前です。リクエストによりタスクのキューイングが行われた場合のみ表示されます。例: task_name=7287390692361099748
17 Pending queue × リクエストが保留キューで費やした時間がある場合のみ表示されます。ログ内に多く存在する場合や、値が高い場合は、インスタンスを増やしてトラフィックに対応する必要があることを示している場合があります。例: pending_ms=195
18 Loading request × リクエストが読み込みリクエストの場合にのみ表示されます。つまり、インスタンスを先に起動しておく必要があります。理想では、リサイクルされて再起動が必要になるまで、インスタンスで多数のリクエストを処理し、可能な限り正常に稼働している必要があります。つまり、ログに多く表示されるべきではありません。例: loading_request=1
19 Instance リクエストを処理するインスタンスの一意の識別子です。例: instance=00c61b117cfeb66f973d7df1b7f4ae1f064d
20 Version 本番環境の App Engine で使用する現在の App Engine リリース バージョン:

割り当てと上限

アプリケーションは次のログに関連する割り当ての影響を受けます。

  • Logs API 経由で取得したログデータ
  • ログ取り込み割り当てと保持

取得したデータの割り当て

Logs API 呼び出しで取得した最初の 100 MB/日のログデータは無料です。100 MB を超えるデータに $ 0.12/GB が課金されます。

ログの取得上限

App Engine アプリのロギングは、Google Cloud Observability によって行われます。ロギングのコストと上限の詳細については、Google Cloud Observability の料金をご覧ください。ログを長期間保存する場合は、Google Cloud Observability から Cloud Storage、BigQuery、Pub/Sub にログをエクスポートできます。