1. ホーム
  2. ジャンゴ

djangoでログ出力を利用する

2022-03-02 08:49:02

django はロギングと国際化の両方に python の標準ライブラリを使用し、国際化には GNU gettext モジュール、ロギングには logging モジュールを使用します。 logging はロギングに非常に強力です。

django の標準設定には LOGGING パラメータがありますが、実装はありません。デフォルトの実装は、 django.utils.log.py で以下のように与えられています。

ログ・パイ

from __future__ import unicode_literals

import logging
import sys
import warnings
# Imports kept for backwards-compatibility in Django 1.7.
from logging import NullHandler # NOQA
from logging.config import dictConfig # NOQA

from django.conf import settings
from django.core import mail
from django.core.mail import get_connection
from django.utils.deprecation import RemovedInNextVersionWarning
from django.utils.encoding import force_text
from django.utils.module_loading import import_string
from django.views.debug import ExceptionReporter, get_exception_reporter_filter

getLogger = logging.getLogger

# Default logging for Django. This sends an email to the site admins on every
# Depending on DEBUG, all other log records are either sent to
Depending on DEBUG, all other log records are either sent to # the console (DEBUG=True) or discarded by mean of the NullHandler (DEBUG=False).
DEFAULT_LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'filters': {
        'require_debug_false': {
            '()': 'django.utils.log.RequireDebugFalse',
        },
        'require_debug_true': {
            '()': 'django.utils.log.RequireDebugTrue',
        },
    },
    'handlers': {
        'console': {
            'level': 'INFO',
            'filters': ['require_debug_true'],
            'class': 'logging.StreamHandler',
        },
        'null': {
            'class': 'logging.NullHandler',
        },
        'mail_admins': {
            'level': 'ERROR',
            'filters': ['require_debug_false'],
            'class': 'django.utils.log.AdminEmailHandler'
        }
    },
    'loggers': {
        'django': {
            'handlers': ['console'],
        },
        'django.request': {
            'handlers': ['mail_admins'],
            'level': 'ERROR',
            'propagate': False,
        },
        'django.security': {
            'handlers': ['mail_admins'],
            'level': 'ERROR',
            'propagate': False,
        },
        'py.warnings': {
            'handlers': ['console'],
        },
    }
}









django のデバッグサーバはデフォルトで autoloading がオンになっているので、 print を直接使うものは全て出力を出力できません、(サーバは作成した子プロセスで起動します) そうでなければ、毎回修正後にサーバを再起動するしかありません、毎回サーバを再起動したくない場合は、自分で LOGGING オプションを設定する必要があります。


djangoのデフォルトの設定から変更して使った解決策は、以下のようにlog.pyからDEFALUT_LOGGINGをインポートしたものです。

LOGGING = DEFAULT_LOGGING
LOGGING['formatters']={
        'standard': {
                'format': '%(levelname)s %(asctime)s %(message)s'
                },
		}
LOGGING['handlers']['console']['formatter']='standard'
In use, the default logger django is used directly, with the following sample code.
#coding=utf-8
<pre name="code" class="python">from django.shortcuts import render
from django.http import HttpResponse
import logging
from django.utils.log import getLogger

# Create your views here.
"""
Don't trust any user submission data, and be sure to escape user submissions.
Otherwise direct string serialization may result in the execution of
(1) in html as javascript is executed
(2) in the database to be executed as a database statement
"""

logger = logging.getLogger("django")
#logger = getLogger()

def show_your_name(request):
	name = request.GET["name"] if "name" in request.GET else "defalute-django"
	logger.warn("name=%s" % (name,))
	return render(request, "safty/show_name.html", locals())















In use, the default logger django is used directly, with the following sample code.

#coding=utf-8

<pre name="code" class="python">from django.shortcuts import render
from django.http import HttpResponse
import logging
from django.utils.log import getLogger

# Create your views here.
"""
Don't trust any user submission data, and be sure to escape user submissions.
Otherwise direct string serialization may result in the execution of
(1) in html as javascript is executed
(2) in the database to be executed as a database statement
"""

logger = logging.getLogger("django")
#logger = getLogger()

def show_your_name(request):
	name = request.GET["name"] if "name" in request.GET else "defalute-django"
	logger.warn("name=%s" % (name,))
	return render(request, "safty/show_name.html", locals())