📝

【GCP】PythonのCloud Loggingでログのフォーマットを設定する

2021/02/24に公開

やり方

import logging
import google.cloud.logging
from google.cloud.logging.handlers import CloudLoggingHandler, setup_logging

# クライアントのインスタンスを生成
client = google.cloud.logging.Client()

# GCPのロギング ハンドラを作成
handler = CloudLoggingHandler(client)

# GCPのロギングシステムの設定
logging_format = '[%(levelname)s, %(name)s], %(message)s'
formatter = logging.Formatter(logging_format)
handler.setFormatter(formatter)
setup_logging(handler, log_level=logging.INFO) # デフォルトはINFO

将来的には対応してくれる?

Pythonのロギング機能では,basicConfig(format=任意のフォーマット)でログのフォーマットの設定ができるが,フォーマットの設定はv2.1.1のPython用Cloud Logging APIでは反映されなかった.
Gitのissueを見ると,v2.5.0で対応してくれるのかな.
参考:Support for logging formatter class

Cloud LoggingのハンドラはPython Loggingのハンドラを継承しているクラスなので,基本的にPython Loggingのハンドラに設定できるものはCloud Loggingのハンドラでも設定できると思っている.

リソースの設定

Cloud Loggingではリソースを設定しない場合,ログはGCPのロギングのglobalに出力される.
もしリソースをCloud RUNのリビジョンにする場合は

res = google.cloud.logging.Resource(
    type="cloud_run_revision",
    labels={
        "project_id": PROJECT_ID, # なくても良い
	"service_name": SURVICE_NAME, # なくても良い
	"revision_name": REVISION_NAME, # なくても良い
	"location": LOCATION, # なくても良い
	"configuration_name": CONFIGURATIONS_NAME, # なくても良い
    },
)

でリソースの設定をしたあと,

handler = CloudLoggingHandler(client, resource=res)

とハンドラを作成するときにリソースを渡してあげれば良い.
リソースのlabelsの設定はしなくても良いが,プロジェクトごと,さらにサービスごとに出力先を絞りたい場合に設定すれば良いみたい.

labelsの項目はリソースのタイプごとに異なるが,それは公式のドキュメントで確認することができる.
公式ドキュメント:Monitored resources and services

Discussion