Cloud Logging への移行

わずか数行のコードで、Cloud Logging を使用するようにアプリを更新し、App Engine ロギング サービスで使用できたのとほぼ同じフィルタリング機能とログ相関機能を実現できます。

Cloud Logging に移行するには、AppEngineHandler ログハンドラを Python ロギング モジュールに接続し、引き続き Python ロギング モジュールを使用してログエントリを書き込みます。Python 2 アプリでこれらの更新を行うと、Python 2 と Python 3 のどちらのランタイムでアプリが実行されてもロギングは同じように動作します。

App Engine ロギングと Cloud Logging の主な違い

  • App Engine のロギングでは、Python ロギング モジュールを使用してアプリのログエントリを書き込む必要があります。Cloud Logging は、次のすべてのアプローチをサポートしています。

    • (推奨)ロギング ハンドラとして AppEngineHandler を接続して Python ロギング モジュールを使用します。この慣用的なアプローチでは、数行のコードを追加するだけで Cloud Logging ハンドラを登録できるので、他の Python 環境にアプリを移植しやすくなります。

    • エントリを stdout または stderr に書き込みます。これらのエントリはログ エクスプローラに表示されますが、フィルタリングとリクエストログとの相関を有効にするには、エントリを JSON オブジェクトとしてフォーマットし、特定のメタデータを指定する必要があります。このアプローチの詳細については、構造化ロギングをご覧ください。

    • Cloud Logging クライアント ライブラリを直接使用します。AppEngineHandler を使用する場合、このアプローチでは Python ロギング モジュールを使用した場合と同じ結果が得られますが、このライブラリから別のロギング フレームワークに変更すると、コードに大幅な更新が必要になる場合があります。

  • App Engine ロギングでは、ログ エクスプローラによってリクエストログに重大度が割り当てられます。この重大度は、リクエストに関連付けられているアプリ ログエントリの最高重大度を表します。たとえば、リクエストによってアプリが警告ログエントリを出力する場合、ログ エクスプローラのリクエスト ログエントリの横に警告アイコンが表示されます。リクエスト エントリを展開すると、リクエスト エントリ内にネストされた警告ログエントリが表示されます。

    Cloud Logging では、ログビューアによってリクエストログに重大度は割り当てられません。リクエスト エントリを展開すると、リクエスト エントリ内にネストされたアプリエントリが表示され、そのアプリエントリに重大度アイコンが表示されます。ただし、リクエスト エントリ自体には重大度アイコンは表示されません。リクエスト エントリを重大度でフィルタすることはできません。

  • 割り当てデータ保持は App Engine と Cloud Logging の両方で同じですが、ログデータの無料割り当てを超える場合、Cloud Logging の料金App Engine ログの料金とは異なることがあります。

移行を開始する前に

  1. アプリが含まれるプロジェクトで Cloud Logging API を有効にします。

    API の有効化

  2. アプリにログを書き込む権限があることを確認します。

    デフォルトでは、アプリのデフォルトのサービス アカウントにログの書き込み権限があります。

    アプリで別のサービス アカウントまたはユーザー アカウントを使用している場合、またはデフォルトのサービス アカウントの権限を変更した場合は、使用するアカウントにログの書き込み権限があることを確認します。

移行プロセスの概要

App Engine ロギングの代わりに Cloud Logging を使用するように Python アプリを移行するには:

  1. Cloud Logging 用の Cloud クライアント ライブラリをインストールします。

  2. Python ロギング モジュールに AppEngineHandler接続します。

  3. アプリを App Engine にデプロイし、ロギングが正常に動作することを確認します。

Cloud Logging 用 Cloud クライアント ライブラリのインストール

アプリが App Engine で実行されているときに AppEngineHandler を使用できるようにするには:

  1. app.yaml ファイルと同じフォルダに requirements.txt ファイルを作成し、次の行を追加します。

     google-cloud-logging==1.14.0
    

    Python 2.7 アプリがサポートされているため、Cloud Logging クライアント ライブラリの 1.14.0 バージョンの使用をおすすめします。

  2. アプリの app.yaml ファイルで、libraries セクションに必須の Google RPC ライブラリと setuptools ライブラリ、オプションの SSL ライブラリを指定します。

    libraries:
    - name: grpcio
      version: 1.0.0
    - name: setuptools
      version: 36.6.0
    - name: ssl
      version: latest
    

    クライアント ライブラリの中には、SSL ライブラリを必要としないものもあります。クライアント ライブラリに必要な SSL ライブラリが含まれていない場合は、アプリがリクエストを受信したとき、ログ エクスプローラに SSL エラーが表示されます。

  3. サードパーティ ライブラリの保存先ディレクトリ(例: lib/)を作成します。次に、pip install を使用して、ディレクトリにライブラリをインストールします。例:

      pip install -t lib -r requirements.txt
      

  4. app.yaml ファイルと同じフォルダに appengine_config.py ファイルを作成します。次のコードを appengine_config.py ファイルに追加します。

    # appengine_config.py
    import pkg_resources
    from google.appengine.ext import vendor
    
    # Set path to your libraries folder.
    path = 'lib'
    # Add libraries installed in the path folder.
    vendor.add(path)
    # Add libraries to pkg_resources working set to find the distribution.
    pkg_resources.working_set.add_entry(path)
    

    上記の例の appengine_config.py ファイルは、lib フォルダが現在の作業ディレクトリにあることを前提としています。lib が常に現在の作業ディレクトリにあることを保証できない場合は、lib フォルダのフルパスを指定します。例:

    import os
    path = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'lib')
    

ローカル開発では、Python 2 の virtualenv などの仮想環境に依存関係をインストールすることをおすすめします。

Python ロギング モジュールへの AppEngineHandler の接続

ログエントリを書き込む各ファイルで次の処理を行います。

  1. Cloud Logging クライアント ライブラリをインポートする。
  2. Cloud Logging クライアントをインスタンス化する。
  3. 現在の環境に適した Cloud Logging ハンドラを取得します。アプリが App Engine で実行されると、Cloud Logging クライアントは AppEngineHandler を取得します。

    AppEngineHandler は、エントリを JSON オブジェクトとしてフォーマットし、重大度によるフィルタリングと、アプリのエントリとリクエスト ログエントリとの関連付けをサポートするために必要なメタデータを提供します。

  4. デフォルト リスナーを Python ルートロガーのロギング ハンドラとして接続する、Cloud Logging クライアントの setup_logging() メソッドを実行します。

例:

# Imports the Cloud Logging client library
import google.cloud.logging

# Instantiates a client
client = google.cloud.logging.Client()

# Retrieves a Cloud Logging handler based on the environment
# you're running in and integrates the handler with the
# Python logging module. By default this captures all logs
# at INFO level and higher
client.setup_logging()

ハンドラに接続すると、デフォルトでは、アプリケーションで出力された INFO レベル以上のログが Logging に送信されます。

# Imports Python standard library logging
import logging

# The data to log
text = "Hello, world!"

# Emits the data using the standard logging module
logging.warning(text)

アプリのデプロイ

アプリをデプロイする準備ができたら、以下を行います。

  1. App Engine でアプリをテストします。

    更新をテストし、重大度が割り当てられ、アプリエントリがリクエスト エントリと関連付けられていることを確認する唯一の方法は、アプリを Python 3 ランタイムにデプロイすることです。

    更新を Python 2 ランタイムにデプロイすると、App Engine ロギング サービスは Python ルートロガーからのエントリをリッスンし、ログ エクスプローラ用に適切にフォーマットします。

    アプリをローカルで実行する場合、Cloud Logging では AppEngineHandler を使用せず、App Engine でリクエスト エントリを書き込めません。

  2. ログ エクスプローラを表示し、アプリのエントリに重大度が割り当てられていることを確認します。リクエスト エントリを開き、リクエストの処理中にアプリによって書き込まれたエントリが、リクエスト エントリの下にネストされていることを確認します。

  3. アプリがエラーなしで実行されている場合、トラフィック分割を使用して、更新したアプリのトラフィックを徐々に増やします。更新したアプリへのトラフィックを増やす前に、問題が発生していないか細かくモニタリングして確認してください。