カテゴリー
アーカイブ

09.27
2024

[Django] Logging について

  • LINE
今回は、DjangoのLoggingの設定について書いていきたいと思います!

設定ファイル(settings.py)

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'verbose': {
            'format': '[%(asctime)s %(levelname)s] %(pathname)s %(lineno)d %(message)s',
        }
    },
    "handlers": {
        'myapp_log': {
            'formatter': 'verbose',
            'class': 'logging.FileHandler',
            'filename': '/var/log/myapp/myapp.log',
        },
        'django_log': {
            'formatter': 'verbose',
            'class': 'logging.FileHandler',
            'filename': '/var/log/myapp/django.log',
        },
    },
    "loggers": {
        "django": {
            "handlers": ["django_log"],
            "level": "ERROR",
            'propagate': False,
        },
        "myapp": {
            'handlers': ['myapp_log'],
            'level': 'DEBUG',
            'propagate': False,
        }
    }
}

settings.py に LOGGING を追加します。

ログ出力方法

import logging
logger = logging.getLogger('myapp')
logger.debug('debug log ですよ。')
logger.info('info log ですよ。')
このようにアプリケーション内でロガーを指定(今回はmyapp)すると、
ログファイル/var/log/myapp/myapp.log にログが出力されます。

DjangoのLoggingの概要を見てみる

まず、 Djangoの公式ドキュメントを読みます。

Djangoの公式ドキュメントに、

Django uses and extends Python's builtin logging module to perform system logging. 
This module is discussed in detail in Python's own documentation.

Djangoは、Pythonの組み込みloggingモジュールを使用および拡張して、システムロギングを実行します。
このモジュールについては、Python独自のドキュメントで詳しく説明されています。

 

と記載があるように、Djangoのloggingは、Pythonの組み込みモジュール「logging」を使っています。
なので詳しい設定はPythonのドキュメントを見ればだいたいok。

それぞれの定義について

versionスキーマのバージョンを表す整数値。現在有効な値は 1 だけ
disable_existing_loggersキーの値を True にすると、全てのデフォルトの設定が無効になる。基本的には FalseでOK 
Handlers:loggerによって生成されたログメッセージの出力先の設定する。
Formatters:ログに出力するテキストの形式を設定する。
Loggers:ログを書き込むための入り口。getLogger('ロガー名') で呼び出したロガー名と一致したロガーを使ってログ出力される。どのログレベルまで表示を行うかを設定できる。
・ログレベル
DEBUG:おもに問題を診断するときにのみ関心があるような、詳細な情報。
INFO:想定された通りのことが起こったことの確認。
WARNING:想定外のことが起こった、または問題が近く起こりそうである (例えば、'disk space low') ことの表示。
ERROR:より重大な問題により、ソフトウェアがある機能を実行できないこと。
CRITICAL:プログラムが実行不可となるような重大なエラーが発生した場合。
 

Djangoのデフォルトのロガー定義

Django には https://github.com/django/django/blob/main/django/utils/log.py にあるように、
デフォルトロガーが定義されています。
# Default logging for Django. This sends an email to the site admins on every
# HTTP 500 error. Depending on DEBUG, all other log records are either sent to
# the console (DEBUG=True) or discarded (DEBUG=False) by means of the
# require_debug_true filter. This configuration is quoted in
# docs/ref/logging.txt; please amend it there if edited here.
DEFAULT_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': '{',
        }
    },
    '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',
        },
    },
    'loggers': {
        'django': {
            'handlers': ['console', 'mail_admins'],
            'level': 'INFO',
        },
        'django.server': {
            'handlers': ['django.server'],
            'level': 'INFO',
            'propagate': False,
        },
    },
}
独自のLOGGINGの設定をする場合は、DEFAULT_LOGGING を settings.py の LOGGINGにコピーして、
出力したい設定を行うとスムーズかもしれません!

以上、Djangoのロガー設定についてでした!