2012-09-17 1 views
0

내가 사용자 정의 파이썬 데이터베이스 로거 갖는 원형의 수입

import logging 
from logging import Handler 
from logger.models import SearchLog 

class DBHandler(Handler,object): 
    model = None 
    def __init__(self, model): 
     super(DBHandler, self).__init__() 
     mod = __import__(model) 
     components = name.split('.') 
     for comp in components[1:]: 
      mod = getattr(mod, comp) 
     self.model = mod 

    def emit(self,record): 
     log_entry = self.model(level=record.levelname, message=record.msg) 
     log_entry.save() 

logging.Handler

확장하는 모델을 dB로 로그인 할 때 내 자신의 로그 핸들러를 만들려고하고이 로그 설정입니다 :

'db_search_log':{ 
    'level': 'INFO', 
    'class': 'db_logger.handlers.DBHandler', 
    'model': 'db_logger.models.SearchLog', 
    'formatter': 'verbose', 
    } 

Traceback (most recent call last): 
    File "manage.py", line 10, in <module> 
    execute_from_command_line(sys.argv) 
    File "/home/james/virtualenv/hydrogen/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 443, in execute_from_command_line 
    utility.execute() 
    File "/home/james/virtualenv/hydrogen/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 382, in execute 
    self.fetch_command(subcommand).run_from_argv(self.argv) 
    File "/home/james/virtualenv/hydrogen/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 252, in fetch_command 
    app_name = get_commands()[subcommand] 
    File "/home/james/virtualenv/hydrogen/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 101, in get_commands 
    apps = settings.INSTALLED_APPS 
    File "/home/james/virtualenv/hydrogen/local/lib/python2.7/site-packages/django/utils/functional.py", line 184, in inner 
    self._setup() 
    File "/home/james/virtualenv/hydrogen/local/lib/python2.7/site-packages/django/conf/__init__.py", line 42, in _setup 
    self._wrapped = Settings(settings_module) 
    File "/home/james/virtualenv/hydrogen/local/lib/python2.7/site-packages/django/conf/__init__.py", line 135, in __init__ 
    logging_config_func(self.LOGGING) 
    File "/usr/lib/python2.7/logging/config.py", line 777, in dictConfig 
    dictConfigClass(config).configure() 
    File "/usr/lib/python2.7/logging/config.py", line 575, in configure 
    '%r: %s' % (name, e)) 
ValueError: Unable to configure handler 'db_search_log': Unable to configure handler 'db_search_log': 'module' object has no attribute 'handlers' 

: 나는 다음과 오류를 얻고있다 그러나

, 스택 트레이스를 참조

db_logger/                                                 
    __init__.py     
    __init__.pyc 
    handlers.py 
    handlers.pyc 
    log_handlers.pyc 
    models.py 
    models.pyc 
    router.py 
    router.pyc 
    tests.py 
    views.py 

순환적인 설정 가져 오기 때문에 @istruble이 지적 했으므로 어떻게 피할 수 있으며 데이터베이스 모델에 계속 로그인 할 수 있습니까?

+0

어떻게 실행하나요? 당신은'python -m pdb'로 시작하거나'import pdb; settings.py에서 pdb.set_trace()를 실행하고 계속하십시오. 그러면 오류가 발생했을 때 pdb 프롬프트가 나타나고 상태를 검사 할 수 있습니까? –

+2

아마도 settings.py를 순환으로 가져올 수 있습니까? 문서의이 섹션에서 위로 6 줄 위로 스크롤하십시오. https://docs.djangoproject.com/en/dev/topics/logging/#custom-logging-configuration – istruble

+0

@struble 그렇습니다. 로그 가져 오기 도구는 순환 가져 오기 때문입니다. 모델... –

답변

2

난 그냥 연기 수입을 사용하여 구현하는 또 다른 사실은 더 표준적인 방법을 함께했다

import logging 
import logger.models.TheModel 

logger = logging.getLogger(__name__) 
logger.info(123, extra={'model':TheModel}) 
, 내 원래의 문제는 초기화 내부 기능을 모델을 수입하려고했던 :

,
from logging import Handler 

class DBHandler(Handler,object): 
    model_name = None 

    def __init__(self, model=""): 
     super(DBHandler,self).__init__() 
     self.model_name = model 

    def emit(self,record): 
     # instantiate the model 
     try: 
      model = self.get_model(self.model_name) 
     except: 
      from logger.models import GeneralLog as model 

     log_entry = model(level=record.levelname, message=self.format(record)) 


     log_entry.save() 

    def get_model(self, name): 
     names = name.split('.') 
     mod = __import__('.'.join(names[:-1]), fromlist=names[-1:]) 
     return getattr(mod, names[-1]) 
1

나는 주위에 일이있어 나는 그것을이

from logging import Handler 

class DBHandler(Handler,object): 
    def __init__(self): 
     super(DBHandler, self).__init__() 

    def emit(self,record): 
     model = record.model 
     log_entry = model(level=record.levelname, message=record.msg) 
     log_entry.save() 

처럼 실제 로깅 점에서 모델 주입을 사용하는 해킹처럼 보인다 인정하고이를 수행하여 올바른 모델에 로그인 :