【GCP入門編・第21回】 Stackdriver Logging でアプリケーションのログを収集しよう!

GCP

投稿日:2018/08/21 | 最終更新日:2018/10/11

前回の記事【第20回】 Stackdriver Logging とは では、 GCP のログ収集、管理サービスである Stackdriver Logging の強力なログ収集及び検索、管理機能について解説しました。
この記事では、実際に Stackdriver Logging を使ってログを送信し、ログの閲覧を行なってみたいと思います。

この記事の目的

  • Stackdriver Logging を使ってログを送信し、ログの閲覧を行おう!

gcloud コマンドを使って、ログを送信する

まずは、 Stackdriver のアカウントを作成し、使用を開始します。【第18回】 Stackdriver Monitoring で App Engine の監視をする を参考に、アカウントの作成を行なって下さい。
アカウントの作成が完了したら、まずは gcloud コマンドを使ってログを送信してみましょう。まずは gcloud コマンドに beta コンポーネントを追加します。ターミナルを開き、以下のコマンドを入力します。

gcloud components install beta

betaコンポーネントのインストール
beta コンポーネントのインストールが完了したら、次はいよいよ gcloud コマンドを使って最初のログを送信してみましょう。

gcloud beta logging write test-log "Hello Stackdriver Logging"

ログの送信
このコマンドでは、 test-log というログに、 “Hello Stackdriver Logging” というメッセージを送信しています。
さて、さっそく送信されたログを閲覧してみましょう。ブラウザを立ち上げて GCP のコンソールを開き、左側のメニューにある “Logging” をクリックし、 Stackdriver Logging のページを開きます。

赤く囲われている部分をクリックし、 “Global” を選択すると、先ほど送信したメッセージが表示されたのではないでしょうか。メッセージをクリックすると、ログのエントリの詳細が表示されます。メッセージのタイプやログが送信されたプロジェクトの ID 、タイムスタンプなどがメッセージと共に保管されていることがわかります。

App Engine のログを収集する

次に App Engine で動作しているサービスのログを収集してみます。
まずは App Engine のサービスを立ち上げましょう。今回は、【第5回】 GAE でのアプリケーション起動方法!で作成した hello-world アプリケーションを App Engine にデプロイし、ログの収集を行いますので、記事の手順に従い、 hello-world アプリケーションを App Engine 上にデプロイします。
デプロイが完了したら、以下のコマンドで hello-world アプリケーションをブラウザで開いてみます。ブラウザ上に hello-world アプリケーションが表示されたら、何度かリロードを繰り返してみましょう。

gcloud app browse

次に、先ほどの Stackdriver Logging のページに移動します。 “Global” となっていた箇所をクリックし、 “GAE Applications” に変更します。すると、以下のように HTTP のログが表示されるのではないでしょうか。
ログの表示
デフォルトの表示では、図のようにタイムスタンプ、 HTTP のメソッド、レスポンスコード、送信したバイト数、レスポンス送信の時間、 User-Agent を省略した表示がされています。
先ほどと同じように、行をクリックすることで、より詳細な表示が行われます。
ログの詳細表示
先ほど gcloud コマンドから送ったログと異なり、このログには httpRequest という要素が追加されていることや、 resource というキーの typegae_app となっていることがみて取れます。
こうした構造化されたログに含まれる値は、 filter の対象にすることが可能です。
それでは、次にアプリケーションを少し変更し、アプリケーションからログを出力してみましょう。
hello-world アプリケーションの main.py をエディタで開き、下記の通り書き換えます。

# Copyright 2016 Google Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# [START app]
import logging
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
    logging.debug("This log is for stackdriver logging.")
    return 'Hello World!'
@app.errorhandler(500)
def server_error(e):
    # Log the error and stacktrace.
    logging.exception('An error occurred during a request.')
    return 'An internal error occurred.', 500
# [END app]

loggingモジュールを使ってデバッグメッセージを出力しています。変更が完了したら、以下のコマンドでデプロイしましょう。

gcloud app deploy

デプロイが済んだら先ほどと同じようにアプリケーションを何度かリロードしてみます。その状態で、 Stackdriver Logging のページに移動します。
Stackdriver Logging
すると、先ほどと違いログの先頭に λ と表示された行が見えるかと思います。こちらをクリックして展開すると、アプリケーションの内部で出力したデバッグメッセージが表示されます。
このように、アプリケーションの中で標準出力に出力された内容は、 Stackdriver Logging で収集されます。

おわりに

いかがでしたか。簡単にログの送信と閲覧が行えることがわかるかと思います。
この記事では紹介しませんでしたが、 App Engine から Stackdriver Logging を使う場合、 Python 標準の logging パッケージを使ってログの送信を行うことも可能です。より詳細なログ、構造化されたログのエントリを追加したい場合は、そちらを試してみるのが良いでしょう。
次回は、本記事の Stackdriver Logging で収集したアプリケーションのログに対して詳細なフィルタを実行する方法と、収集したログをベースに Stackdriver Monitoring で警告を設定する方法を紹介します。

同じシリーズの記事

GCP のメリットを最大限に活用しよう!

GCP・G Suite のご相談・
お見積り依頼はお気軽に
TEL.03-5840-8815
お問合せフォーム TEL.03-5840-8815