Search by

    djangoでロギング

    「ログさんとちゃんと向き合いたいから、おれドキュメント、読むね」

    というわけで、djangoでのロギングを調べた。

    結論


    下記の様に書くと、エラーが起きた時、自分にメールが届きます。

    settings.py
    # エラーを通知するメールアドレス
    ADMINS = [( your name', 'name@sample.com' )]
    
    # メールを送信するアカウントの設定(これ必要なのか)
    EMAIL_HOST = 'samplehost'
    EMAIL_PORT = 'sampleport'
    EMAIL_HOST_USER = 'sampleport'
    EMAIL_HOST_PASSWORD = 'samplepassword'
    EMAIL_USE_TLS  = 'sampletls'
    
    # loggingの設定
    # (仮想環境)\Lib\site-packages\django\utils\log.pyの`DEFAULT_LOGGING`をコピーする
    LOGGING = {
        'version': 1,
        # ここは、trueにすると、defaultの設定が無効になるのでfalseにしておく。
        'disable_existing_loggers': False,
        'filters': {
            'require_debug_false': {
                '()': 'django.utils.log.RequireDebugFalse',
            },
            'require_debug_true': {
                '()': 'django.utils.log.RequireDebugTrue',
            },
        },
        'formatters': {
            'django.server': {
                '()': 'django.utils.log.ServerFormatter',
                'format': '[{server_time}] {message}',
                'style': '{',
            }
        },
        'handlers': {
            'console': {
                'level': 'INFO',
                'filters': ['require_debug_true'],
                'class': 'logging.StreamHandler',
            },
            'django.server': {
                'level': 'INFO',
                'class': 'logging.StreamHandler',
                'formatter': 'django.server',
            },
            'mail_admins': {
                'level': 'ERROR',
                'filters': ['require_debug_false'],
                'class': 'djangoc.utils.log.AdminEmailHandler'
            },
        },
        'loggers': {
            'django': {
                'handlers': ['console', 'mail_admins'],
                'level': 'INFO',
            },
            'django.server': {
                'handlers': ['django.server'],
                'level': 'INFO',
                'propagate': False,
            },
            # 自分のアプリケーションを追加
            'delivery': {
                # エラーによって、ハンドル方法を指定
                'handlers': ['console', 'mail_admins'], 
                # LEVEL
                'level': 'INFO',
                # 上位のモジュールに情報を伝えるか? true = yes
                'propagate': True,
            },
        }
    }
    
    loggingしたいmodule.py
    import logging
    logger = logging.getLogger(__name__)
    logger.error('Something went wrong!')

    公式ページ

    ログの構造


    ログを出力する部品とその役割

    詳細は、公式ドキュメントでわかる気がするので、 イメージを残しておく。 logging

    ロガーの名前

    ロガーを作るときは下記の様にするがベスプラ。

    logger = logging.getLogger(__name__)

    なぜ、__name__にするのか?

    公式に書いてあることを自分なりに解釈すると、 下記の様に、エラーは上位のモジュールにpropagate(伝播)させることが出来るから。 logging

    __name__(階層構造を持った自分の名前)にしておけば、アプリでエラーが起きた時に、最上位のdjangoまでエラー情報が伝わるので、django全体でのロギングに関する管理が容易になる。

    Tags