2011-09-29 3 views
3

djutils의 비동기 데코레이터를 사용합니다. 별도의 스레드에서 실행되므로 예외가 발생했을 때 추적 전자 메일을 보내지 않는 것이 좋지 않은 부작용이 있습니다.수동으로 Django 1.3의 추적/예외 로그를 ​​실행합니다.

그러나 로거를 넣을 장소는 다음과 같습니다.

def worker_thread(): 
    while 1: 
     func, args, kwargs = queue.get() 
     try: 
      func(*args, **kwargs) 
     except: 
      pass # <-- log error here 
     finally: 
      queue.task_done() 

나는 이것이 작동 확인했지만, 심지어는 시도로/제거를 제외하고는 장고의 역 추적 로거를 여행하지 않습니다.

예외적으로 db/파일에 쓰는 것이 꽤 쉽지만 설정에서 정의 된대로 정규 추적을 보내고 싶습니다. 어떻게해야합니까?

편집 : 대답은 django.utils.log.AdminEmailHandler와 관련이있는 것으로 보이지만 예제를 찾는 데 어려움을 겪고 있습니다.

편집 2 : 다음은 현재 (99 % 가능성이 높음) 시도입니다.

from django.utils.log import AdminEmailHandler 
def worker_thread(): 
    while 1: 
     func, args, kwargs = queue.get() 
     try: 
      func(*args, **kwargs) 
     except: 
      import logging 
      from django.conf import settings 
      print settings.EMAIL_HOST 
      logger = logging.getLogger("async.logger") 
      logger.exception("Async exploded") 
      AdminEmailHandler 
      pass # <-- log error here 
     finally: 
      queue.task_done() 
+0

여기에 표시된대로 오류를 로깅하려고 시도 했습니까? https://docs.djangoproject.com/en/dev/topics/logging/ (로깅 프레임 워크에서 전자 메일을 보냈습니다) – akonsu

+0

트라이를했습니다. 이 : 가져 오기 로깅; logger = logging.getLogger ("async.logger"); logger.exception ("Async exploded"); 화재는 있지만 아무 것도하지 않는 것으로 보입니다. 그리고 아마도 내가 잘못 구현 한 것임을 처음으로 인정할 것입니다. –

+0

settings.py에 올바른 이메일 설정 (예 : EMAIL_HOST, EMAIL_HOST_PASSWORD 등)이 있습니까? – akonsu

답변

3

첫째, 구성 로깅 설정은 내가 settings.py를 :

:


    LOGGING = { 
     'version': 1, 
     'disable_existing_loggers': False, 
     'handlers': { 
      'mail_admins': { 
       'level': 'ERROR', 
       'class': 'django.utils.log.AdminEmailHandler' 
      } 
     }, 
     'loggers': { 
      'myproject': { 
       'handlers': ['mail_admins'], 
       'level': 'INFO', 
       'propagate': True, 
      }, 
      'django.request': { 
       'handlers': ['mail_admins'], 
       'level': 'ERROR', 
       'propagate': True, 
      }, 
     } 
    } 

지금부터, 'myproject라는'로 시작하는 모든 로거 코드는 다음과 같이한다 AdminEmailHandler 를 사용한다


    import logging 
    logger = logging.getLogger('myproject.optional.path') 
    # example 
    # logger = logging.getLogger('myprojects.myapp.views') 
    def worker_thread(): 
     while 1: 
      func, args, kwargs = queue.get() 
      try: 
       func(*args, **kwargs) 
      except: 
       logger.exception("Async exploded") 
      finally: 
       queue.task_done() 

관련 문제