Google App Engineのアクセスログをダウンロードするには?旧App Engine SDKのappcfgを使って、Combined Log Formatのアクセスログをダウンロードする方法

Google App Engineのアクセスログを表示・取得するには2種類の方法があります。ひとつは、Cloud SDKのgcloud、もうひとつは、App Engine SDKのappcfgです。

Cloud SDKのgcloudは、
Common Log Format相当のログを表示。

App Engine SDKのappcfgは、
Combined Log Formatのログをダウンロード。

Cloud SDKのgcloud

Cloud SDKのgcloudでログを表示できます。

gcloud app logs readで、直前の200行を表示します。

$ gcloud app logs read --logs=request_log
2020-04-09 08:03:27 default[20200405t000706]  "GET /jquery.jpostal.js?_=1586419407599 HTTP/1.1" 200
2020-04-09 08:03:27 default[20200405t000706]  "GET /json/525.json?callback=jQuery_jpostal_callback&_=1586419367992 HTTP/1.1" 200
(省略)Code language: Bash (bash)

--limitオプションで行数を指定できます。

$ gcloud app logs read --logs=request_log --limit=1000Code language: Bash (bash)

gcloud app logs tail で、最新ログをストリーミング表示します。Ctrl + Cで終了します。

$ gcloud app logs tail --logs=request_log
2020-04-09 08:03:27 default[20200405t000706]  "GET /jquery.jpostal.js?_=1586419407599 HTTP/1.1" 200
2020-04-09 08:03:27 default[20200405t000706]  "GET /json/525.json?callback=jQuery_jpostal_callback&_=1586419367992 HTTP/1.1" 200
(省略)
Ctrl + C で終了Code language: Bash (bash)

表示されるログの内容は、ほぼCommon Log Format相当の項目で、日時、メソッド、URL、ステータスコードです。ただし、転送バイト数は表示されません。

また、リファラーやUserAgentも表示されません。転送バイト数やリファラー、UserAgentも取得したい場合は、次に説明するApp Engine SDKのappcfgを使って、Combined Log Formatのアクセスログをダウンロードします。

App Engine SDKのappcfg

App Engine SDKは非推奨となりましたが、App Engine SDKのappcfgを使って、Combined Log Formatのアクセスログをダウンロードできます。

以下、インスタンスが1つだけの場合です。

まず、バージョン一覧を表示します。

APP_IDの箇所は、application idです。仮に、myapp-1234とします。

$ export APP_ID=myapp-1234

$ appcfg.py --application=$APP_ID list_versions
01:01 AM Host: appengine.google.com
default: [20200403t000705, '1', 20190704t142926, 20190804t134302, 20190901t151503,
  20191005t003752, 20191103t151559, 20191213t114343, 20200105t000209, 20200207t234131,
  20200301t155026]
Code language: PHP (php)

default配列の先頭が、現在のバージョンです。これを--versionオプションで指定します。

$ appcfg.py --application=$APP_ID --version=20200403t000705 request_logs 2020-04-08-01-01-01.logCode language: PHP (php)

--version="*"でワイルドカード指定できないのかな?

最後に答えるわね

--num_daysオプションを指定しない場合

--num_daysオプションを指定しない場合、当日の00:00:00から現在までのログをダウンロードします。

12:00に実行すると、12時間分のログをダウンロードします。

23:55に実行すると、23時間55分間のログをダウンロードします。

1日2回、12:00と23:55に実行するとどうなるのかな?

12:00の回は、12時間分のログです。

23:55の回は?12:00からの続きをダウンロードするのかな?

いいえ、前回からの続きの12:00〜23:55ではなく、00:00〜23:55のログをダウンロードします。

この「当日の00:00:00」は、日本時間の00:00:00ではなく、サーバ時間の 00:00:00 です。ログをダウンロードして、サーバ時間のタイムゾーンオフセットを確認してください。

xxx.xxx.xxx.xxx - - [09/Apr/2020:00:54:04 -0700] "GET /jquery.jpostal.js HTTP/1.1" 200 6433 - "Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36"
Code language: JavaScript (javascript)

この例では「-0700」、-7時間、アメリカ山岳部のタイムゾーンです。日本のタイムゾーンは、+9時間なので、ログ時刻に +16時間したものが、日本での時間です。つまり、サーバが0時0分のとき、日本は16時0分です。

日本時間の4月8日15:55に実行すると?

サーバ時間は4月7日23:55だから

4月7日00:00〜23:55のログをダウンロードするのね

日本時間の4月8日16:05に実行すると?

サーバ時間は4月8日00:05だから

たった5分間のログになってしまうわ!

--num_days=2を指定した場合

--num_days=2 を指定すると、前日のログもダウンロードします。

前日のログをフルに24時間ダウンロードできるか試しました。

日本時間4月8日18:15に、--num_days=2で実行してみました。

サーバ時間4月7日00:00〜4月8日02:15のログをダウンロードできたの?

できたわ!

サーバ時間で日が変わって数分以内に、 --num_days=2 で実行すると、前日の24時間と当日の数分間のログをダウンロードできました。

サーバのタイムゾーンが-0700なので、日本時間16:02に、--num_days=2 で実行するようにしました。

--num_days=0を指定したとき

--num_days=0 を指定すると、そのバージョンに残っている全てのログをダウンロードします。

どれくらい過去まで残っているかは、明記されていません。

行数や日数で残っているのかな?

去年6月は、1080万行、約19日分をダウンロードできました。

今年4月は、600万行、約7日分をダウンロードできました。

行数でも日数でもないようね

デプロイしてバージョンが変わったとき

デプロイしてバージョンが変わったときも注意が必要です。

デプロイした当日のログは、旧バージョンと新バージョンに2つに分かれてしまうので、2回ダウンロードしなければいけません。

1日に1回のデプロイなら

旧バージョン
新バージョン
の2つ

さらに、1日に2回デプロイしたときは、当日のログは、3つのバージョンに分かれてしまいます。3回ダウンロードしなければいけません。

1日2回デプロイしたら

旧バージョン
デプロイ1回めのバージョン
デプロイ2回めのバージョン
の3つね

--version="*"でワイルドカード指定できないのかな?

500エラーだったわ

タイトルとURLをコピーしました