GoogleAppEngine上でDjangoフレームワークのログをStackdriver Loggingに流す

PythonのloggingモジュールからStackdriverにログを流す手順はドキュメントに書かれている。

Setting Up Stackdriver Logging for Python  |  Stackdriver Logging  |  Google Cloud

Djangoフレームワークを使っている場合は、Djangoのロギング設定を考慮する必要がある。

ちゃんと設定しておくと、logging.infoやlogging.errorで出力したレベルの情報をStackdriver上でも付与された状態でログを見れる。

f:id:nullpobug:20181222074919p:plain

Python 3.7、Django 2.1.4、google-cloud-logging 1.9.1で試した。

Djangoの設定

あらかじめ、対象のプロジェクトでStackdriver LoggingのAPIを有効にしておく。

また、クライアントライブラリ( google-cloud-logging ) をインストールしておく。

Djangosettings.py に追記する想定。

from google.cloud import logging as google_cloud_logging

log_client = google_cloud_logging.Client()

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'stackdriver_logging': {
            'class': 'google.cloud.logging.handlers.AppEngineHandler',
            'client': log_client,
        },
    },
    'loggers': {
        'django': {
            'handlers': ['stackdriver_logging'],
            'level': 'INFO',
            'propagate': True,
        },
        'django.request': {
            'handlers': ['stackdriver_logging'],
            'level': 'ERROR',
        },
    },
    'root': {
        'handlers': ['stackdriver_logging'],
        'level': 'INFO',
    }
}
  • AppEngineのデフォルトのサービスアカウントで書き込みは可能なので認証の設定は不要
  • ドキュメントにある setup_logging() は、呼ばないでおく(Django側でロギングのセットアップが走るので不要)
  • rootロガーの設定は好み
  • AppEngineを使っている場合のハンドラは、 google.cloud.logging.handlers.AppEngineHandler を使っておくとFlexible/Standardどちらでも都合が良いらしい
  • gunicornのログも流そうとすると、いろいろややこしいのでDjangoのみにしてある

参考