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

概要

リクエストがアプリに送信されると、App Engine によってリクエストログが自動的に書き込まれます。リクエストの処理中には、アプリでアプリケーション ログを書き込むこともできます。このページでは、アプリケーションからアプリケーション ログを書き込む方法、Logs API を使用してアプリケーション ログとリクエストログの両方をプログラムで読み込む方法、Google Cloud Platform Console でログを表示する方法、App Engine がリクエスト時に書き込むリクエストログ データを理解する方法について学習します。logs パッケージの内容については、logs パッケージ リファレンスをご覧ください。

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

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

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

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

App Engine Go SDK では、次の重大度レベルのログを記録できます。

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

次のスニペットは、ログエントリを書き込む方法を示しています。

import (
	"net/http"

	"google.golang.org/appengine"
	"google.golang.org/appengine/datastore"
	"google.golang.org/appengine/log"
)

func logHandler(w http.ResponseWriter, r *http.Request) {
	ctx := appengine.NewContext(r)

	post := &Post{Body: "sample post"}
	key := datastore.NewIncompleteKey(ctx, "Posts", nil)
	if _, err := datastore.Put(ctx, key, post); err != nil {
		log.Errorf(ctx, "could not put into datastore: %v", err)
		http.Error(w, "An error occurred. Try again.", http.StatusInternalServerError)
		return
	}
	log.Debugf(ctx, "Datastore put successful")

	w.Write([]byte("ok!"))
}

Google Cloud Platform Console におけるログ URL 形式

GCP Console のログ URL 形式の例については、次のサンプル URL をご覧ください。

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

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

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

ログビューアでラベルまたはテキスト検索によってログエントリをフィルタリングするには、基本ログフィルタをご覧ください。任意の数のログに含まれる一連のログエントリを指定した式を使用して高度なログフィルタを作成する方法については、高度なログフィルタをご覧ください。

一般的な App Engine ログには、以下のサンプルログに示すとおり、Apache と組み合わせたログ形式のデータが特別な 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.9.76

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

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

フィールドの順番 フィールド名 常に表示 説明
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=XXXXXX はインスタンスがシャットダウンした理由に対応する 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 リリース バージョン: 1.9.76

割り当てと制限

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

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

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

Logs API 呼び出しで取得した最初の 100 MB/日のログデータは無料です。この量を超過すると、アプリの課金が有効になっていない限り Logs API 呼び出しは行われません。アプリの課金が有効になっている場合は、100 MB を超えるデータに $0.12/GB が課金されます。

ログの取得上限

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

開発用サーバーと Logs API

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

dev_appserver.py --logs_path=your-path/your-logfile-name your-app-directory

このページは役立ちましたか?評価をお願いいたします。

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

Go の App Engine スタンダード環境