こんにちは。磯野です。
Cloud RunでPythonプログラムを実行する際、ログレベルをCloud Loggingへ反映させる方法をご紹介します。
はじめに
Cloud Runのログは自動的にCloud Loggingへ反映される
Cloud Runのログは、print文やloggingライブラリを使用して標準出力に文字列を出力すると 自動的に Cloud Logging に記録 されます。
しかし、このままだとすべてログレベルがデフォルトとなってしまいます。(下記画像参照)
このままではエラー調査やフィルタの活用が難しくなってしまう、ということで、本記事ではログレベルの反映方法をご紹介します。
方法1:公式ドキュメントの記載方法を利用
下記を参考に設定します。
Python 用 Cloud Logging の設定 | Google Cloud
コードの記載方法
ログの設定方法
import google.cloud.logging client = google.cloud.logging.Client() # 実行中の環境に基づいて Cloud Logging ハンドラを取得し、 # このハンドラを Python のログモジュールと統合します。 # デフォルトでは INFO レベル以上のすべてのログをキャプチャします。 client.setup_logging()
ログの出力
import logging text = "Hello, world!" logging.warning(text)
Cloud Loggingへの出力結果
無事にログレベルが反映されました。
ところが…
該当のCloud Runジョブ画面 >ログ という画面遷移であればログが表示されたのですが
該当のCloud Runジョブ画面 > 該当の実行ID > ログという画面遷移だと、ログが表示されませんでした。
labelsに”run.googleapis.com/execution_name”が付与されておらず、ジョブ単位にログをフィルタすることができなかったのが原因のようです。ジョブ単位にログをフィルタする必要がある場合は、方法2を推奨します。
※こちらGoogleの不具合のようで、googleapiのgithub上で本件issueになっていました。
追って解消されるかもしれません。
方法2:StructuredLogHandler()を使用する
コードの記載方法
ログの設定方法
import logging import google.cloud.logging from google.cloud.logging_v2.handlers import StructuredLogHandler logger = logging.getLogger() handler = StructuredLogHandler() logger.setLevel(logging.INFO) logger.addHandler(handler)
ログの出力
出力方法は方法1と同じため、割愛します
Cloud Loggingへの出力結果
ログレベルの反映・labelsの付与ができました。
まとめ
ログレベルの反映に苦労したので、記事にしました。
参考になれば幸いです。