😺

Djangoのログ設定

2022/07/24に公開

1. Djangoのログ設定の基本

djagoのログ設定はsettings.pyのLOGGING定数に設定する。ロギングの設定に出てくる登場人物は3人だけである。

  1. formatter
  2. handler
  3. logger

2. formatter

formatterはどんな情報をログ出力するかを決定する。

"formatters": {
        "local": {
            "format": "%(asctime)s [%(levelname)s] %(pathname)s:%(lineno)d %(message)s"
        }
}

上記はlocalという名前のformatterを作成している。

3. formatter

ハンドラーはどこにログ出力するかを決定する(標準出力やファイルなど)。また、どのformatterを使用するかも決める。

"handlers": {
        "console": {
            "class": "logging.StreamHandler",
            "formatter": "local"
        }
    }

4. logger

loggerは実際にログが入力されるオブジェクトのことである。どのハンドラーを流買うか決定する。

# 自分が出すログ出力
    "root": {
        "handlers": ["console"],
        "level": "DEBUG",
        "propagate": False
    },
    "loggers": {
        # Djangoのエラー・警告・開発WEBサーバのアクセスログ
        'django': {
            'handlers': ['console'],
            'level': 'INFO',
            'propagate': False,
        },
        # 実行SQL
        'django.db.backends': {
            'handlers': ['console'],
            'level': 'DEBUG',
            'propagate': False,
        }
    }

上記ではroot,django,django.db.backendsという3つのロガーが設定されている。例えばapp/views.pyでログ出力すると、rootロガーが使われる。

import logging

logger = logging.getLogger(__name__)

__name__は現在のファイルのパスのapp.viewsである。このファイルのパスが名前解決されてapp.views -> views -> rootロガーを探しに行き、app.viewsとviewsロガーは存在しないためrootロガーが使用される。propagate: Falseに設定することでロガーが複数使われることを防いでいる。propagate: Trueに設定されたapp.viewsロガーが存在した場合app.viewsロガーとrootロガーからログ出力される。

LOGGING = {
    "version": 1,
    "disable_existing_loggers": False,
    "formatters": {
        "local": {
            "format": '%(asctime)s [%(levelname)s] %(pathname)s:%(lineno)d %(message)s'
        }
    },
    "handlers": {
        "console": {
            "class": "logging.StreamHandler",
            "formatter": "local"
        }
    },
    # 自分が出すログ出力
    "root": {
        "handlers": ["console"],
        "level": "DEBUG",
        "propagate": False
    },
    "loggers": {
        # Djangoのエラー・警告・開発WEBサーバのアクセスログ
        'django': {
            'handlers': ['console'],
            'level': 'INFO',
            'propagate': False,
        },
        # 実行SQL
        'django.db.backends': {
            'handlers': ['console'],
            'level': 'DEBUG',
            'propagate': False,
        }
    }
}

Discussion