Не удается зарегистрировать пользовательский класс обработчика журналов с Django dictConfig - PullRequest
5 голосов
/ 05 августа 2011

Моя цель - создать приложение "log", помимо моего основного приложения, которое будет использоваться для нескольких пользовательских классов обработчиков, фильтров и т. Д., А также для других отчетов об ошибках и статистике.Но при запуске сервера dev для моего проекта Django я получаю сообщение об ошибке:

  File "/Library/Python/2.7/site-packages/Django-1.3-py2.7.egg/django/conf/__init__.py", line 42, in _setup
    self._wrapped = Settings(settings_module)
  File "/Library/Python/2.7/site-packages/Django-1.3-py2.7.egg/django/conf/__init__.py", line 139, in __init__
    logging_config_func(self.LOGGING)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/logging/config.py", line 776, in dictConfig
    dictConfigClass(config).configure()
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/logging/config.py", line 575, in configure
    '%r: %s' % (name, e))
ValueError: Unable to configure handler 'db_handler': Unable to configure handler 'db_handler': 'module' object has no attribute 'models'

Моя директива LOGGING в настройках выглядит так:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'default': {
            'format': '[%(asctime)s] %(levelname)s::(%(process)d %(thread)d)::%(module)s - %(message)s'
        },
    },
    'handlers': {
        'db_handler': {
            'level': 'DEBUG',
            'class': 'Project.log.handlers.db_handler'
        },
        'file_handler': {
            'level': 'DEBUG',
            'formatter':'default',
            'class': 'logging.TimedRotatingFileHandler',
            'filename':'Custom_log',
            'when':'midnight',
            'interval':1
        },
    },
    'loggers': {
        'django.request': {
            'handlers': ['db_handler'],
            'level': 'DEBUG',
            'propagate': True,
        },
    }
}

Макет моего приложения "log"довольно просто, и в настоящее время:

log/
    __init__.py
    handlers.py
    models.py

models.py содержит одну модель, LogHandler :

from django.db import models

class LogRecord(models.Model):
    .... 
    ....

и handlers.py содержит один обработчик:

import logging

from models import LogRecord

class db_handler(logging.Handler):   
    def emit(self, record):
        ....
        ....

Ошибка, насколько я могу судить, относится к из строки импорта моделей LogRecord .Я попытался использовать project.log.models и log.models, но оба дают одинаковые результаты.Я также попытался переместить обработчик в models.py и ничего не импортировать, но я получаю похожую ошибку, в которой говорится, что у «module» нет атрибута «models».

Мое приложение журнала находится в моих установленных приложениях, исодержит __ init __ .py.

1 Ответ

12 голосов
/ 05 августа 2011

Похоже, вы получаете круговой импорт. Вы не можете определить класс обработчика в модуле, который сам импортирует settings.py

Это задокументировано в https://docs.djangoproject.com/en/dev/topics/logging/#topic-logging-parts-handlers (Поиск 'круговой импорт')

...