🐷

DjangoのDEBUG=FalseでStatus500なのにログが表示されない!

2024/11/26に公開

DjangoでブラウザにServer Error (500)と表示されたのにログが表示されなくて「???」となったので、対処法です。

結論

1. (プロジェクト名)/templates/500.html作りましょう!

ついでに、403.html404.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")],

2. LOGGINGを書く

(プロジェクト名)/(プロジェクト名)/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