Подтвердить что ты не робот

Для регистратора не найдено никаких обработчиков

Я новичок в Django. Сейчас я пытаюсь выполнить запись в Django. При попытке, я получаю эту ошибку [ "Нет обработчиков для журнала" sample ""].. вот мой код,

(В моих settings.py)

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'simple': {
            'format': '%(asctime)s %(levelname)s %(name)s %(message)s'
        },
    },
    'handlers': {
        'default': {
            'level':'DEBUG',
            'class':'logging.handlers.RotatingFileHandler',
            'filename': '/home/linuxuser/mani/f/logs/msg.log',
            'maxBytes': 1024*1024*5, # 5 MB
            'backupCount': 5,
            'formatter':'simple',
        },
    },
    'loggers': {
        'sample': {
            'handlers': ['default'],
            'level': 'DEBUG',
            'propagate': True,
        },
    }
}

(В моих views.py)

import logging
import logging.handlers
from django.conf import settings
logger = logging.getLogger('sample')

def empdel(request,id):
    e = get_object_or_404(emp, pk=id)
    e.delete()
    logger.info('A row is deleted successfully !!!')
    return HttpResponseRedirect('/empthanks/')

При запуске этого кода я получил эту ошибку, т.е. [ "Нет обработчиков для журнала" sample ""]. Что не так с моим кодом? Почему я получаю такую ​​ошибку, даже если я использую обработчик в LOGGING? а также я пытаюсь сохранить сообщение журнала в файл, который я использовал в LOGGING... любая идея?? Спасибо заранее.

4b9b3361

Ответ 1

Документы немного неясны в этом, но когда вы используете встроенную функциональность для указания параметров ведения журнала, вам не нужно получать экземпляр регистратора.

Вы просто выполните следующее:

import logging

def empdel(request,id):
    e = get_object_or_404(emp, pk=id)
    e.delete()
    logging.info('A row is deleted successfully !!!')
    return HttpResponseRedirect('/empthanks/')

Ответ 2

Я думаю, вы неправильно поняли, что такое Handler в контексте пакета logging.

Обработчик - это объект, который вы прикрепляете к Logger. Всякий раз, когда журнал имеет сообщение для обработки, он отправляет сообщение всем своим обработчикам. Кроме того, регистраторы существуют в древовидной структуре, с меткой "root" Logger в ее корне. После отправки сообщения своим обработчикам, регистратор может передать его родительскому элементу в дереве (определяется атрибутом экземпляра Logger propagate).

Как немного юмористический, я однажды обнаружил ошибку приложения, в которой кто-то начал использовать Logger с именем "root", который отличается от Root Logger.

Не используйте корневой регистратор (доступ к которому осуществляется logging.info и компанией, или logging.getLogger()). Любые обработчики, которые вы прикрепляете или изменяете настройки, также будут влиять на хорошо выполненные библиотеки, которые распространяют свои ошибки до корневого регистратора. Пример: я как-то написал простой script, используя корневой регистратор из лени. Затем я включил несколько вызовов на boto и получил взрыв сообщений отладки, которые распространялись в корневой журнал. Рекомендуется всегда создавать регистратор, имя которого соответствует имени вашего пакета в пространстве имен (это также приводит к хорошей структуре наследования с интерпретацией getLogger .), создавая регистраторы с logging.getLogger(__name__)

Я настоятельно рекомендую подробно ознакомиться с разделом об объектах Logger в документах logging: https://docs.python.org/2/library/logging.html

Вы можете заметить, что ваш конфиг также указывает Formatter. Formatters обрабатывают представление сообщения, когда оно обрабатывается обработчиком, так что одно сообщение может быть отформатировано по-разному для вывода терминала, чем для, например, rsyslog.


Все сказанное, чтобы исправить ваш код, вы можете использовать созданный вами регистратор, и просто прикрепите к нему обработчик. Я бы рекомендовал создать StreamHandler (базовый класс Handler не предназначен для создания экземпляра, но по ужасным причинам это не ABC), так как это охватывает множество типичных случаев использования.

myhandler = logging.StreamHandler()  # writes to stderr
myformatter = logging.Formatter(fmt='%(levelname)s: %(message)s')
myhandler.setFormatter(myformatter)
logger.addHandler(myhandler)

Однако, похоже, что конфигурация Django уже включает в себя много этой информации, но не настроена так, как я делаю что-то выше, конечно. Не имея на самом деле письменных приложений Django, я не хочу давать вам плохую информацию об этом, но Django предоставляет хорошие документы здесь: https://docs.djangoproject.com/en/dev/topics/logging/