🐷
DjangoのDEBUG=FalseでStatus500なのにログが表示されない!
Django
でブラウザにServer Error (500)
と表示されたのにログが表示されなくて「???」となったので、対処法です。
結論
(プロジェクト名)/templates/500.html
作りましょう!
1. ついでに、403.html
、404.html
も作っておくと良いです。
(プロジェクト名)/templates/500.html
{% extends "base.html" %}
{% load i18n %}
{% block title %}{% trans "Internal server error" %}{% endblock %}
{% block body %}
<h1>{% trans "Internal server error" %}</h1>
{% endblock %}
また、settings.py
のルートのtemplates
を読み込む設定も忘れずに!
(プロジェクト名)/settings.py
...
TEMPLATES = [
{
"BACKEND": "django.template.backends.django.DjangoTemplates",
+ "DIRS": [BASE_DIR / "templates"],
...
`django`が古いバージョンで作ったプロジェクトなど、`BASE_DIR`が`str`のプロジェクトでは、`pathlib.path`に変えるか、`os.path.join`を使います。
pathlib.path
変更して
(プロジェクト名)/settings.py
+from pathlib import Path
...
-BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
+BASE_DIR = Path(__file__).resolve().parent.parent
上と同じようにする
os.path.join
代わりに
(プロジェクト名)/settings.py
TEMPLATES = [
{
"BACKEND": "django.template.backends.django.DjangoTemplates",
+ "DIRS": [os.path.join(BASE_DIR, "templates")],
LOGGING
を書く
2. (プロジェクト名)/(プロジェクト名)/settings.py
+LOGGING = {
+ "version": 1,
+ "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": "{",
+ },
+ "verbose": {
+ "format": "[%(asctime)s] %(levelname)s [%(name)s:%(lineno)s] %(message)s",
+ "datefmt": "%d/%b/%Y %H:%M:%S",
+ },
+ },
+ "handlers": {
+ "console": {
+ "level": "INFO",
+ "class": "logging.StreamHandler",
+ },
+ "django.server": {
+ "level": "INFO",
+ "class": "logging.StreamHandler",
+ "formatter": "django.server",
+ },
+ "mail_admins": {
+ "level": "ERROR",
+ "filters": ["require_debug_false"],
+ "class": "django.utils.log.AdminEmailHandler",
+ },
+ },
+ "loggers": {
+ "django": {
+ "handlers": ["console", "mail_admins"],
+ "level": "DEBUG",
+ },
+ "django.server": {
+ "handlers": ["console", "django.server"],
+ "level": "DEBUG",
+ "propagate": False,
+ },
+ },
+}
ちなみに、ファイルに書き込むようにするには
(プロジェクト名)/(プロジェクト名)/settings.py
...
"formatters": {
"django.server": {
"()": "django.utils.log.ServerFormatter",
"format": "[{server_time}] {message}",
"style": "{",
},
+ "verbose": {
+ "format": "[%(asctime)s] %(levelname)s [%(name)s:%(lineno)s] %(message)s",
+ "datefmt": "%d/%b/%Y %H:%M:%S",
+ },
},
+ "handlers": {
+ "file": {
+ "level": "DEBUG",
+ "class": "logging.FileHandler",
+ "filename": "log_file.log",
+ "formatter": "verbose",
+ },
...
ちなみに、デフォルト値(django.utils.log
)との差分は以下。
(プロジェクト名)/(プロジェクト名)/settings.py
LOGGING = {
"version": 1,
"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": "{",
},
+ "verbose": {
+ "format": "[%(asctime)s] %(levelname)s [%(name)s:%(lineno)s] %(message)s",
+ "datefmt": "%d/%b/%Y %H:%M:%S",
+ },
},
"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": "django.utils.log.AdminEmailHandler",
},
+ "file": {
+ "level": "DEBUG",
+ "class": "logging.FileHandler",
+ "filename": "log_file.log",
+ "formatter": "verbose",
+ },
+ },
"loggers": {
"django": {
"handlers": [
"console",
"mail_admins",
+ "file",
],
- "level": "INFO",
+ "level": "DEBUG",
},
"django.server": {
"handlers": [
"console",
"django.server",
+ "file",
],
- "level": "INFO",
+ "level": "DEBUG",
"propagate": False,
},
},
}
Discussion