이제 실서버에서 크고 작은 오류가 계속 발생할텐데, 원활한 디버깅을 위해서는 로그가 준비되어 있어야 한다. Nginx나 uWSGI에서도 로깅을 해 주기는 하지만, 해 봐야 access log 정도라 크게 도움이 되지 않는다.
Logging
Django의 logging은 Python의 logging이라는 built-in module을 사용한다. logging은 네 가지 configuration을 통해 logging process를 처리한다.
•
Loggers: 로깅의 시작 부분이다. 각각의 로그 메시지는 DEBUG|INFO|WARNING|ERROR|CRITICAL 중 하나의 log level을 가지고 있는데, 이 단계에서는 logging process로 넘길 최소한의 log level을 지정할 수 있다. 로그 레벨이 지정 수준 이상이면 다음 단계로 넘어간다.
•
Handlers: 넘어온 로그 메시지를 통해 실행할 작업을 다룬다. 예컨대 로그 메시지를 console에 띄우거나, file에 쓸 수 있다. 이 단계에서도 log level의 지정이 가능하다.
•
Filters: 특정한 패턴을 가지는 로그 메시지를 추가적으로 걸러내거나, 변경할 수 있다. 예컨대 특정 패턴을 가지는 ERROR 레벨의 로그를 INFO 레벨로 다운그레이드 할 수 있다.
•
Formatters: 이 부분에서 넘어 온 로그 메시지의 text rendering format을 지정할 수 있다.
Setting
Django setting 파일에 다음과 같은 줄을 추가함으로써 Logging을 할 수 있다. 다음 코드는 BASE_DIR의 logs/log 파일에 로그를 기록하도록 한 것이다.
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'verbose': {
'format': '{levelname} {asctime} {module} {process:d} {thread:d} {message}',
'style': '{',
},
},
'handlers': {
'file': {
'level': 'DEBUG',
'class': 'logging.FileHandler',
'filename': os.path.join(BASE_DIR, 'logs/log'),
'formatter': 'verbose',
},
},
'loggers': {
'django': {
'handlers': ['file'],
'level': 'DEBUG',
'propagate': True,
}
}
}
Python
복사
Trouble Shooting
설정을 잘 했고, 로컬에서도 잘 돌아가는데 Deploy를 해 보면 Internal Server Error가 나올 것이다. 이는 Nginx를 돌리는 ubuntu 유저가 해당 경로에 대한 writing 권한을 가지지 않고 있기 때문이다.
다음 포스트를 참조하여 폴더를 생성해준 후 권한을 수정해 주면 잘 돌아간다. 안전하게 베이스 디렉토리로 설정해 주자.
E.O.D.