Django는 파이썬 로깅 라이브러리 logging을 이용하여 로깅할 수 있다.
로깅을 사용하려면 settings.py에 개별 설정을 해주면 된다.
settings.py에 로깅 설정 추가
settings.py에 아래 로그 설정 코드를 넣어준다.
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'filters': {
'require_debug_false': {
'()': 'django.utils.log.RequireDebugFalse',
},
'require_debug_true': {
'()': 'django.utils.log.RequireDebugTrue',
},
},
'formatters': {
'django.server': {
'()': 'django.utils.log.ServerFormatter',
'format': '[{server_time}] {message}',
'style': '{',
},
'standard': {
'format': '%(asctime)s [%(levelname)s] %(name)s: %(message)s'
},
},
'handlers': {
'console': {
'level': 'INFO',
'filters': ['require_debug_true'],
'class': 'logging.StreamHandler',
},
'django.server': {
'level': 'INFO',
'class': 'logging.StreamHandler',
'formatter': 'django.server',
},
'mail_admins': {
'level': 'ERROR',
'filters': ['require_debug_false'],
'class': 'django.utils.log.AdminEmailHandler'
},
'file': {
'level': 'INFO',
'encoding': 'utf-8',
'filters': ['require_debug_false'],
'class': 'logging.handlers.RotatingFileHandler',
'filename': BASE_DIR / 'logs/drugstrore.log',
'maxBytes': 1024*1024*5, # 5 MB
'backupCount': 5,
'formatter': 'standard',
},
'file_crawler': {
'level': 'INFO',
'encoding': 'utf-8',
'filters': ['require_debug_false'],
'class': 'logging.handlers.RotatingFileHandler',
'filename': BASE_DIR / 'logs/crawler.log',
'maxBytes': 1024*1024*5, # 5 MB
'backupCount': 5,
'formatter': 'standard',
},
},
'loggers': {
'django': {
'handlers': ['console', 'mail_admins', 'file'],
'level': 'INFO',
},
'django.server': {
'handlers': ['django.server'],
'level': 'INFO',
'propagate': False,
},
'crawlerlogger': {
'handlers': ['console', 'file_crawler'],
'level': 'INFO',
},
}
}
구조는 아래와 같이 나뉜다.
- version : 형식 버전
- disable_existing_loggers : True로 두면 모든 로거가 비활성화됨
- filters : Logger를 통해 Handler로 들어온 로그 레코드를 추가적 설정가능. 보통 로그 출력 필터나 로그 레코드 수정함
- formatters : 로그 레코드를 text로 렌더할 때, text의 format 지정
- Handlers : 각 메세지에서 발생하는 작업을 어떻게 처리할 것인지 정하는 엔진 (파일, 소켓 등으로 지정 가능)
- Loggers : 로깅 시스템의 entry point. 메세지 처리는 Handler를 통해 함. 여러개의 Handler 소유 가능
코드를 보면 아래쪽에 logger를 만들었는데, django와 django.server는 기본 로거로 설정한 것이고 'crawlerlogger'는 새로 커스텀화한 것이다.
crawlerlogger는 console과 file_crawler 핸들러를 갖는데, 각각 콘솔과 파일에 로그를 출력해주는 핸들러이다.
file_crawler의 경우 로그가 저장되는 폴더를 지정가능하고, 최대 크기와 backupcount등도 설정가능하다.
(단, 폴더 지정 시, 프로젝트 실행 전에 폴더가 생성되었는지 확인하는 작업이 필요하다)
코드 작성
로깅 설정을 했으니, 실제 코드에서는 다음과 같이 사용할 수 있다.
import logging
logger = logging.getLogger('crawlerlogger')
logger.info("Complete to create chromedriver")
logger.error(f"Error while creating chromedriver")
import로 logging을 하고 getLogger를 통해 사용할 로거를 입력하면 로거 객체가 생성된다.
생성된 객체로 로깅 레벨을 다르게 하여 출력할 수 있다.
참고 docs
https://docs.djangoproject.com/en/4.2/topics/logging/