Cloud Run functionsのログをCloud Loggingへ連携する

記事タイトルとURLをコピーする

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

Cloud Run functions のログ出力

標準出力と標準 logger

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

print 文により Cloud Logging に送出されたテキスト

Cloud Logging ライブラリ

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

Cloud Logging のログエクスプローラーに表示される severity

severity の一覧

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

print や標準 logger ではログレベルが全て Default になる

しかし、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

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

2. Cloud Logging ライブラリ使用

Cloud Logging クライアントライブラリ

Cloud Logging ライブラリを使用した場合、ログエントリの左端に色付きで severity が表示されているのが分かります。ソースコード内で指定したログレベルが、Cloud Logging ログエントリの severity として反映されています。

Cloud Logging クライアントライブラリと統合されていることにより、ログレベルのほか「実行ファイル名」「ログ送出元の関数名(main)」「ログが発生したプログラムの行数」などもログに含まれています。

様々な付加情報

杉村 勇馬 (記事一覧)

執行役員 CTO

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