秋のログ整理週間です。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や障害時の対応がやりやすくなります。
また、extra
などにさらに付加的な情報を付与することが簡単にできる(cloud loggingに構造化された形で出力されるので、検索も容易)ので、これは乗り換えるしないですね。快適な秋のloggingライフを送りましょう!