わずか数行のコードで、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 ログの料金とは異なることがあります。
移行を開始する前に
アプリが含まれるプロジェクトで Cloud Logging API を有効にします。
アプリにログを書き込む権限があることを確認します。
デフォルトでは、アプリのデフォルトのサービス アカウントにログの書き込み権限があります。
アプリで別のサービス アカウントまたはユーザー アカウントを使用している場合、またはデフォルトのサービス アカウントの権限を変更した場合は、使用するアカウントにログの書き込み権限があることを確認します。
移行プロセスの概要
App Engine ロギングの代わりに Cloud Logging を使用するように Python アプリを移行するには:
Cloud Logging 用の Cloud クライアント ライブラリをインストールします。
Python ロギング モジュールに
AppEngineHandler
を接続します。アプリを App Engine にデプロイし、ロギングが正常に動作することを確認します。
Cloud Logging 用 Cloud クライアント ライブラリのインストール
アプリが App Engine で実行されているときに AppEngineHandler
を使用できるようにするには:
app.yaml
ファイルと同じフォルダにrequirements.txt
ファイルを作成し、次の行を追加します。google-cloud-logging==1.14.0
Python 2.7 アプリがサポートされているため、Cloud Logging クライアント ライブラリの 1.14.0 バージョンの使用をおすすめします。
アプリの
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 エラーが表示されます。
サードパーティ ライブラリの保存先ディレクトリ(例:
lib/
)を作成します。次に、pip install
を使用して、ディレクトリにライブラリをインストールします。例:pip install -t lib -r requirements.txt
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
の接続
ログエントリを書き込む各ファイルで次の処理を行います。
- Cloud Logging クライアント ライブラリをインポートする。
- Cloud Logging クライアントをインスタンス化する。
現在の環境に適した Cloud Logging ハンドラを取得します。アプリが App Engine で実行されると、Cloud Logging クライアントは
AppEngineHandler
を取得します。AppEngineHandler
は、エントリを JSON オブジェクトとしてフォーマットし、重大度によるフィルタリングと、アプリのエントリとリクエスト ログエントリとの関連付けをサポートするために必要なメタデータを提供します。デフォルト リスナーを Python ルートロガーのロギング ハンドラとして接続する、Cloud Logging クライアントの
setup_logging()
メソッドを実行します。
例:
ハンドラに接続すると、デフォルトでは、アプリケーションで出力された INFO
レベル以上のログが Logging に送信されます。
アプリのデプロイ
アプリをデプロイする準備ができたら、以下を行います。
-
更新をテストし、重大度が割り当てられ、アプリエントリがリクエスト エントリと関連付けられていることを確認する唯一の方法は、アプリを Python 3 ランタイムにデプロイすることです。
更新を Python 2 ランタイムにデプロイすると、App Engine ロギング サービスは Python ルートロガーからのエントリをリッスンし、ログ エクスプローラ用に適切にフォーマットします。
アプリをローカルで実行する場合、Cloud Logging では
AppEngineHandler
を使用せず、App Engine でリクエスト エントリを書き込めません。 ログ エクスプローラを表示し、アプリのエントリに重大度が割り当てられていることを確認します。リクエスト エントリを開き、リクエストの処理中にアプリによって書き込まれたエントリが、リクエスト エントリの下にネストされていることを確認します。
アプリがエラーなしで実行されている場合、トラフィック分割を使用して、更新したアプリのトラフィックを徐々に増やします。更新したアプリへのトラフィックを増やす前に、問題が発生していないか細かくモニタリングして確認してください。