GAEのログは自動でGAE内に保管されますが、デフォルトの設定では1GB or 90日間のどちらかの条件に達すると、古いデータから削除されてしまいます。その為、ログを永続的に保管するには、外部サービスに保管する必要が有ります。
GAEはオプションで、以下の2つのサービスに自動でログをエクスポートし保管させることができます。
・BigQuery
・GCS
やり方は簡単で、Google Developers Consoleから対象のプロジェクトを選択し「Monitoring」->「Logs」->「Exports」と進みます。
BigQueryに保管させる場合は、既存or新規のデータセットを選択して、「Stream App Engine Logs to BigQuery」にチェックを入れます。
GCSに保管させる場合は、既存or新規のバケットを選択して、「Save App Engine Logs to Cloud Storage」にチェックを入れます。
最後に「Done」をクリックすれば設定完了です。
直接BigQueryに保管させることもできますが、ストレージ費用やログ保管単位(BigQueryは1日単位、GCSは1時間単位)の違いなどで、GCSに保管させる方が良い場合もあります。
この記事では、GCSに自動でエクスポートし保管させたGAEのログをBigQueryにロードする方法を記載します。
#1.データセットの作成
BigQueryのトップページにて、データセットを作成します。
#2.テーブルの作成及びインポート
先ほど作成したデータセットを選択し、テーブルの作成を行います。ウィザードに従って以下の通り進めます。
####1.「Table ID」にはデータセット内にてユニークなテーブルIDを入力します。
####2.「Source Format」は「JSON」を選択します。「Load data from」は「Google Cloud Strage」を選択し、GCSに自動エクスポートされたGAEのログのフルパス(gs://~)を入力します。
####3.「Schema」には、以下のJSONファイルの中身を全部をコピーし、貼り付けます。
https://gist.github.com/yang36/46a9f3332d057e785edd
####4.最後の画面で「Ignore unknown values」にチェックを入れ、「submit」をクリックします。
※チェックを入れることにより、BigQueryのテーブルスキーマに定義されていない値は無視(破棄)されます。現状、いくつかの値はプログラム等による加工を行わない限り、そのままBigQueryに格納することはできません。
また、GAEの設定により、出力される値が微妙に変化することも確認されています。全てのログを保管させたい場合は、GAEから直接BigQueryにエクスポートし保管させる方法を推奨します。
#3.無視(破棄)されるデータについて
以下のようなデータが無視(破棄)されます。
"appengine.googleapis.com/module_id": "default",
"appengine.googleapis.com/version_id": "20150324a",
"appengine.googleapis.com/clone_id": "00c61b117c3335a4c278e4a25bd43eb92ba2cf40"
"@type": "type.googleapis.com/apphosting.RequestLog"
これらのデータを無視(破棄)しなければならない理由は、BigQueryのテーブルスキーマの列名に、アンダースコア(_)以外の記号が使用できない為です。
#4.ちなみに
GAEのログをGCSに保管させるのとBigQueryに保管させるのと、どちらが費用的に安くなるのでしょうか?
以下の公式ドキュメントを見る限りGCS(Nearline Storage)に保管したほうが安く見えます。
https://cloud.google.com/storage/pricing#storage-pricing
https://cloud.google.com/bigquery/pricing#storage
しかし、BigQueryに保管したほうが、ストレージサイズは小さくなります!(不要なJSON形式が省かれ、生データのみ格納されるため)
その為、実際のプロジェクト内容によって、どちらが安くなるかは変動すると思われます。