나는 이것이 이미 해결 된 대답이라는 것을 알고 있지만 django> = 1.3에 따라 새로운 로깅 설정이 있습니다.
이전에서 새 것으로 이동하는 것은 자동이 아니므로 여기에 적어 두겠습니다.
그리고 물론 더 많은 것을 위해 django 문서 를 확인 하십시오 .
이것은 django-admin createproject v1.3으로 기본적으로 생성되는 기본 conf입니다. 마일리지는 최신 django 버전으로 변경 될 수 있습니다.
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'mail_admins': {
'level': 'ERROR',
'class': 'django.utils.log.AdminEmailHandler',
}
},
'loggers': {
'django.request': {
'handlers': ['mail_admins'],
'level': 'ERROR',
'propagate': True,
}
}
}
이 구조는 다음 블록을 지시하는 표준 Python 로깅 dictConfig를 기반으로합니다 .
나는 보통 적어도 이것을한다 :
- .log 파일 추가
- 이 로그에 쓰도록 내 앱 구성
다음으로 번역됩니다.
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'verbose': {
'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s'
},
'simple': {
'format': '%(levelname)s %(message)s'
},
},
'filters': {
'require_debug_false': {
'()': 'django.utils.log.RequireDebugFalse'
}
},
'handlers': {
'null': {
'level':'DEBUG',
'class':'django.utils.log.NullHandler',
},
'console':{
'level': 'DEBUG',
'class': 'logging.StreamHandler',
'formatter': 'simple'
},
# I always add this handler to facilitate separating loggings
'log_file':{
'level': 'DEBUG',
'class': 'logging.handlers.RotatingFileHandler',
'filename': os.path.join(VAR_ROOT, 'logs/django.log'),
'maxBytes': '16777216', # 16megabytes
'formatter': 'verbose'
},
'mail_admins': {
'level': 'ERROR',
'filters': ['require_debug_false'],
'class': 'django.utils.log.AdminEmailHandler',
'include_html': True,
}
},
'loggers': {
'django.request': {
'handlers': ['mail_admins'],
'level': 'ERROR',
'propagate': True,
},
'apps': { # I keep all my of apps under 'apps' folder, but you can also add them one by one, and this depends on how your virtualenv/paths are set
'handlers': ['log_file'],
'level': 'INFO',
'propagate': True,
},
},
# you can also shortcut 'loggers' and just configure logging for EVERYTHING at once
'root': {
'handlers': ['console', 'mail_admins'],
'level': 'INFO'
},
}
편집하다
이제 요청 예외가 항상 기록 되고 티켓 # 16288을 참조하십시오 .
기본적으로 debug가 True 일 때 이메일이 전송되지 않도록 mail_admins에 대한 올바른 필터를 명시 적으로 포함하도록 위의 샘플 conf를 업데이트했습니다.
필터를 추가해야합니다.
'filters': {
'require_debug_false': {
'()': 'django.utils.log.RequireDebugFalse'
}
},
mail_admins 핸들러에 적용합니다.
'mail_admins': {
'level': 'ERROR',
'filters': ['require_debug_false'],
'class': 'django.utils.log.AdminEmailHandler',
'include_html': True,
}
그렇지 않으면 django.core.handers.base.handle_uncaught_exception
settings.DEBUG가 True 인 경우 'django.request'로거에 오류를 전달하지 않습니다.
Django 1.5에서이 작업을 수행하지 않으면
DeprecationWarning : 'mail_admins'로깅 핸들러에 정의 된 필터가 없습니다. 암시 적 디버그-거짓 전용 필터 추가
그러나 django 1.4와 django 1.5에서 모두 올바르게 작동합니다.
** 편집 종료 **
이 conf는 django 문서의 샘플 conf에서 영감을 얻었지만 로그 파일 부분을 추가했습니다.
나는 종종 다음을 수행합니다.
LOG_LEVEL = 'DEBUG' if DEBUG else 'INFO'
...
'level': LOG_LEVEL
...
그런 다음 내 파이썬 코드에서 로깅 conf가 정의되지 않은 경우 항상 NullHandler를 추가합니다. 이렇게하면 핸들러가 지정되지 않은 경우 경고가 발생하지 않습니다. Django ( ref ) 에서만 호출되지 않는 libs에 특히 유용합니다.
import logging
# Get an instance of a logger
logger = logging.getLogger(__name__)
class NullHandler(logging.Handler): #exists in python 3.1
def emit(self, record):
pass
nullhandler = logger.addHandler(NullHandler())
# here you can also add some local logger should you want: to stdout with streamhandler, or to a local file...
[...]
logger.warning('etc.etc.')
도움이 되었기를 바랍니다!