PythonのログをGoogle Cloud(GCP)のログエクスプローラーに出力する

Google Cloud(GCP)のサービス(Cloud Run、Cloud Functionsなど)をPythonで実装した場合に、
ログをGoogle Cloud(GCP)の標準のログエクスプローラーに出力する方法を記述します。

公式ドキュメントはこちら

Google Cloud(GCP)のログエクスプローラーにPythonの標準ログを接続する設定

以下をプログラム内に記述

import google.cloud.logging

# Cloud Logging ハンドラをPython ルートロガーにアタッチ
logging_client = google.cloud.logging.Client()
logging_client.setup_logging()

これで、Pythonの標準ログを出力するとGoogle Cloud(GCP)ログエクスプローラーに出力されるようになります。

Pythonのログ出力は以下の通り(公式ドキュメントはこちら

import logging
import google.cloud.logging

# Cloud Logging ハンドラをPython ルートロガーにアタッチ
logging_client = google.cloud.logging.Client()
logging_client.setup_logging()

logging.debug("debug log test")
logging.info("info log test")
logging.warning("warning log test")
logging.error("error log test")
logging.critical("critical log test")

ログレベルは以下の通りです。

公式ドキュメントには、いろいろ説明がありますがレベルはプロジェクトごと、
開発チームで決めちゃえばいいと思います。

  • DEBUG
  • INFO
  • WARNING
  • ERROR
  • CRITICAL

Google Cloud(GCP)の出力は次の通り

このままだと、debugレベルが出力されてない様です。

Pythonのログレベルの設定をします。

import logging
import google.cloud.logging

# Cloud Logging ハンドラをPython ルートロガーにアタッチ
logging_client = google.cloud.logging.Client()
logging_client.setup_logging()

# ログレベルとファーマット設定
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)

logging.debug("debug log test")
logging.info("info log test")
logging.warning("warning log test")
logging.error("error log test")
logging.critical("critical log test")

logging.getLogger()でログ出力するオブジェクトを取得して、
setLevelでログレベルをセットしています。

出力結果は以下の通り

設定ファイルを使用してログを制御する方法

logging.configというファイルを使用したログ設定です。

こちらの方が環境ごとの分岐など、実用的かなと思ったのですが、
ハンドラにうまくgoogle.cloud.loggingのクラスが渡す方法がわからずエラーとなるため、
一旦、この方法は断念します。

試してみたファイルとエラーメッセージだけ記載しておきます。

公式ドキュメントはこちら

import logging
import google.cloud.logging

# Cloud Logging ハンドラをPython ルートロガーにアタッチ
logging_client = google.cloud.logging.Client()
logging_client.setup_logging()

# 設定ファイル読み込み
logging.config.fileConfig('config/logging.conf')
# ログレベルとファーマット設定
logger = logging.getLogger()

logging.debug("debug log test")
logging.info("info log test")
logging.warning("warning log test")
logging.error("error log test")
logging.critical("critical log test")

※getLoggerで名称を指定しなければrootが取得される想定

以下、config/logging.confファイルです。

[loggers]
keys=root

[handlers]
keys=common

[formatters]
keys=common

[logger_root]
level=INFO
handlers=common

[handler_common]
class=google.cloud.logging.handlers.CloudLoggingHandler
level=NOTSET
formatter=common
args=()

[formatter_common]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s

この状態で実行すると

TypeError: CloudLoggingHandler.__init__() missing 1 required positional argument: 'client'

確かにgoogle.cloud.logging.handlers.CloudLoggingHandlerはインスタンス時に「google.cloud.logging.Client()」を引数として渡す必要があるのですが、やり方がわかりません…

設定ファイルを使用しないやり方の方が無難なのかもしれません。

コメントする