😺
Djangoのログ設定
1. Djangoのログ設定の基本
djagoのログ設定はsettings.pyのLOGGING定数に設定する。ロギングの設定に出てくる登場人物は3人だけである。
- formatter
- handler
- 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