G-gen の杉村です。Cloud Run functions で Python プログラムを動作させる際に、ログをどのように扱い、出力させればよいかについてご紹介します。

Cloud Run functions のログ出力
標準出力と標準 logger
Cloud Run functions や Cloud Run services 等で動作するプログラムが標準出力に文字列を出力すると、自動的に Cloud Logging にログとして記録されます。つまり Python プログラムで print するだけで、テキストを Cloud Logging に送信できます。

Cloud Logging ライブラリ
本番運用におけるトラブルシューティングなどをスムーズに行うためには、 Cloud Logging エントリに severity(重要度)を反映したり、 JSON 形式で追加の情報を持たせてそれをもとにフィルタしたりと、 Cloud Logging の強力なフィルタ機能と組み合わせて利用することが有用です。


前述の print や logging で単純に文字列を出力しただけでは、Cloud Logging のログエントリに severity を反映することはできません。標準 logging ライブラリでログレベルを設定して出力したとしても、Cloud Logging 上では全て Default ログレベルとして表示されてしまいます。ログレベルを反映するには JSON 形式でログを構造化し、severity というキーを含めることで反映させることができます。

しかし、Cloud Run functions で動作するプログラムで Cloud Logging のクライアントライブラリを使用することで、簡単にログレベル(severity)を反映させたり、カスタム属性を追加することができます。
ライブラリのインストール
pip コマンドで実行環境に google-cloud-logging をインストールします。
Cloud Run functions へデプロイした際に実行環境にライブラリが追加されるよう、 requirements.txt にも反映してください。
pip install google-cloud-logging
サンプルコード
比較のため、 Cloud Logging ライブラリを用いる場合と用いない場合の2パターンの Cloud Run functions 関数を作成します。
1. Cloud Logging ライブラリ無し
#!/usr/bin/env python import logging # 標準 Logger の設定 logging.basicConfig( format = "[%(asctime)s][%(levelname)s] %(message)s", level = logging.DEBUG ) logger = logging.getLogger() def main(request): logger.critical("This is a CRITICAL log entry.") logger.error("This is an ERROR log entry.") logger.warning("This is a WARNING log entry.") logger.info("This is an INFO log entry.") logger.debug("This is a DEBUG log entry.") return "OK"
2. Cloud Logging ライブラリ使用
#!/usr/bin/env python import logging import google.cloud.logging # 標準 Logger の設定 logging.basicConfig( format = "[%(asctime)s][%(levelname)s] %(message)s", level = logging.DEBUG ) logger = logging.getLogger() # Cloud Logging ハンドラを logger に接続 logging_client = google.cloud.logging.Client() logging_client.setup_logging() logger.setLevel(logging.DEBUG) def main(request): logger.critical("This is a CRITICAL log entry.") logger.error("This is an ERROR log entry.") logger.warning("This is a WARNING log entry.") logger.info("This is an INFO log entry.") logger.debug("This is a DEBUG log entry.") return "OK"
前者のコードと後者のコードの差は、4行目の import 文と、13〜16行目のみです。
13〜16行目では、Cloud Logging のクライアントを生成して標準 logger ライブラリと接続させています。これによりロガーに送出されたログは、全て Cloud Logging に送信されます。
実行結果
上記の Python プログラムを Cloud Run functions(第2世代)にデプロイし、実行しました。
1. Cloud Logging ライブラリ無し

標準 logger で指定したログレベルは、Cloud Logging ログエントリの severity として反映されていません。
2. Cloud Logging ライブラリ使用

Cloud Logging ライブラリを使用した場合、ログエントリの左端に色付きで severity が表示されているのが分かります。ソースコード内で指定したログレベルが、Cloud Logging ログエントリの severity として反映されています。
Cloud Logging クライアントライブラリと統合されていることにより、ログレベルのほか「実行ファイル名」「ログ送出元の関数名(main)」「ログが発生したプログラムの行数」などもログに含まれています。

杉村 勇馬 (記事一覧)
執行役員 CTO
元警察官という経歴を持つ IT エンジニア。クラウド管理・運用やネットワークに知見。AWS 認定資格および Google Cloud 認定資格はすべて取得。X(旧 Twitter)では Google Cloud や Google Workspace のアップデート情報をつぶやいています。
Follow @y_sugi_it