JavaScriptを有効にしてください

【Python】Django のロギング設定メモ

 ·  ☕ 3 分で読めます

Django のロギング設定メモ

Django でロギングを設定する方法について詳しく解説します。ロギングを適切に設定することで、アプリケーションのエラーハンドリングやデバッグが容易になります。

ロギングの概要

Django には組み込みのロギング機能があり、設定ファイル(settings.py)で詳細な設定を行うことができます。ロギングを設定することで、アプリケーションの挙動を監視し、問題発生時に迅速に対応できるようになります。

ロギング設定のサンプルコード

以下は、Django プロジェクトにおけるロギング設定の例です。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
import os
from logging.handlers import TimedRotatingFileHandler

# プロジェクトのベースディレクトリ
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

# ログを保存するディレクトリ
LOG_DIR = os.path.join(BASE_DIR, "logs")

# ログディレクトリが存在しない場合は作成
if not os.path.exists(LOG_DIR):
    os.makedirs(LOG_DIR)

LOGGING = {
    "version": 1,  # ロギングの設定バージョン(1固定)
    "disable_existing_loggers": False,  # 既存のロガーを無効化しない
    "handlers": {
        "file": {
            "level": "DEBUG",  # DEBUG レベル以上のログを記録
            "class": "logging.handlers.TimedRotatingFileHandler",  # 時間でログをローテーション
            "filename": os.path.join(LOG_DIR, "django.log"),
            "when": "midnight",  # 毎日ログをローテーション
            "interval": 1,        # 1日ごとにローテーション
            "backupCount": 7,     # 7日分のログを保持
            "formatter": "verbose",
            "encoding": "utf-8",  # 文字化け防止
        },
        "console": {
            "level": "DEBUG",  # DEBUG レベル以上のログをコンソール出力
            "class": "logging.StreamHandler",  # コンソール用のハンドラ
            "formatter": "verbose",
        },
    },
    "formatters": {
        "verbose": {
            "format": "\t".join(
                [
                    "[%(levelname)s]",  # ログレベル(INFO, DEBUG など)
                    "asctime:%(asctime)s",  # ログの出力日時
                    "module:%(module)s",  # モジュール名
                    "message:%(message)s",  # ログメッセージ
                ]
            )
        },
    },
    "root": {
        "handlers": ["file", "console"],  # ルートロガーの出力先
        "level": "INFO",  # ルートロガーのログレベル(INFO以上)
    },
    "loggers": {
        "django": {
            "handlers": ["file", "console"],  # Django 内部のロギングを記録
            "level": "INFO",  # INFO レベル以上のログを記録
            "propagate": True,  # 上位のロガーにもログを伝播
        },
        "django.utils.autoreload": {
            "handlers": ["file", "console"],  # Django の自動リロード時のログ設定
            "level": "CRITICAL",  # CRITICAL レベル以上のみ記録
            "propagate": False,  # 上位のロガーには伝播しない
        },
    },
}

設定のポイント

ログディレクトリの作成

ログを保存するディレクトリ logs/ が存在しない場合、自動的に作成する処理を追加しています。

1
2
if not os.path.exists(LOG_DIR):
    os.makedirs(LOG_DIR)

これにより、アプリケーションを実行した際にエラーが発生することを防ぎます。

TimedRotatingFileHandler の利用

  • TimedRotatingFileHandler を使用することで、毎日 0 時にログをローテーション(新しいファイルに切り替え)します。
  • backupCount: 7 を指定することで、過去 7 日分のログを保持し、それ以前のログは削除されます。

ログのフォーマット

ログのフォーマットを verbose という名前で設定し、以下のような情報を記録するようにしています。

1
2
3
4
5
6
7
8
"format": "\t".join(
    [
        "[%(levelname)s]",
        "asctime:%(asctime)s",
        "module:%(module)s",
        "message:%(message)s",
    ]
)

これにより、ログが見やすく整理され、デバッグしやすくなります。

root ロガーの設定

  • すべてのログを fileconsole に出力します。
  • level: INFO に設定し、INFO 以上のレベルのログを記録します。

django.utils.autoreload の CRITICAL 設定

Django の自動リロードに関するログは CRITICAL レベルのみ記録し、不要な情報を減らしています。

ログレベルの説明

レベル説明
DEBUGデバッグ用の詳細な情報
INFO一般的な操作ログ
WARNING潜在的な問題が発生した場合の警告
ERRORエラー発生時のログ
CRITICAL致命的なエラー

ログの出力例

設定したログフォーマットにより、以下のようなログが記録されます。

[INFO]    asctime:2024-01-20 12:34:56,789    module:views    message:ユーザーがログインしました。
[ERROR]    asctime:2024-01-20 12:35:10,123    module:views    message:ログイン処理でエラーが発生しました。

まとめ

Django のロギング設定を適切に行うことで、アプリケーションのエラーや動作状況を記録し、トラブルシューティングが容易になります。
ぜひ、Django プロジェクトでのロギング設定に活用してください!

参考

共有

こぴぺたん
著者
こぴぺたん
Copy & Paste Engineer