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

概要

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

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

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

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

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

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

標準の Python ロギング モジュールのドキュメントにも有益な情報が記載されています。Python.org でドキュメントをご確認ください。

Python ロギング モジュールを使用すると、次の 5 つの重大度レベルのログを記録できます。

  • デバッグ
  • 情報
  • 警告
  • エラー
  • 重大

以下の例は、異なるロギングレベルの使い方を表しています。

import logging

import webapp2


class MainPage(webapp2.RequestHandler):
    def get(self):
        logging.debug('This is a debug message')
        logging.info('This is an info message')
        logging.warning('This is a warning message')
        logging.error('This is an error message')
        logging.critical('This is a critical message')

        try:
            raise ValueError('This is a sample value error.')
        except ValueError:
            logging.exception('A example exception log.')

        self.response.out.write('Logging example.')


app = webapp2.WSGIApplication([
    ('/', MainPage)
], debug=True)

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 にログをエクスポートできます。

開発用サーバーと Logs API

デフォルトで、ログは開発用サーバーのメモリにのみ保存されます。Logs API 機能のテストを行う場合にアクセスできます。ログを開発用サーバーから任意の場所のディスクに保存するには、次のように、--logs_path コマンドライン オプションに必要なパスとファイル名を指定します。

   python2 [DEVAPPSERVER_ROOT]/google_appengine/dev_appserver.py --logs_path=your-path/your-logfile-name your-app-directory