GKE上で動くPythonのコードのログをいい感じに出力する

秋のログ整理週間です。Cloud Loggingに出力されるログをもっといい感じにしようと思って試行錯誤してます。

太古からGKE上のloggingをいい感じにするのは悩みの種でした。結論としては、Cloud Loggingのパッケージを使うしかなさそう。

ところで、本番環境などはもちろんCloud Loggingにログが出力されるのがよいですが、手元で動かすときにもCloud Loggingにログが出力されるのはイマイチです。手元からの場合は普通にstdoutなどに出力するなど、実行する環境によって出力先もコントロールしたい。

「うーん...」と考えたところ、GKE上でのみ有効になる環境変数があれば実行環境が分かることに気付きました。自分で設定するのはイマイチなので、GKEなどで標準で入る環境変数を調べたところKUBERNETES_SERVICE_HOSTというのがあるのが分かりました。そんなわけで、実行環境によってhanderの設定を変えればよさそうです。

import os
import sys
import logging

from google.cloud.logging_v2.handlers import StructuredLogHandler

logger = logging.getLogger("my_logging")
logger.setLevel(logging.INFO)

if os.environ.get('KUBERNETES_SERVICE_HOST'):
    logger.addHandler(StructuredLogHandler(stream=sys.stdout))
    logger.propagate = False
else:
    logger.addHandler(logging.StreamHandler(sys.stdout))

↑をよく読むとloggerにContainerEngineHandlerではなく、StructuredLogHandlerが設定されていることが分かります。実はContainerEngineHandlerは3系に上がる際にDEPRECATEDになっているからでした。

StructuredLogHandlerに切り替えるといいことがあって、勝手にログの出力元をsourceLocationに設定してくれるので、debugや障害時の対応がやりやすくなります。

sourceLocationで出力元が分かる

また、extraなどにさらに付加的な情報を付与することが簡単にできる(cloud loggingに構造化された形で出力されるので、検索も容易)ので、これは乗り換えるしないですね。快適な秋のloggingライフを送りましょう!