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()」を引数として渡す必要があるのですが、やり方がわかりません…
設定ファイルを使用しないやり方の方が無難なのかもしれません。