♠️

Appendix 1. Logging

Created
2020/12/26 05:37
Tags
이제 실서버에서 크고 작은 오류가 계속 발생할텐데, 원활한 디버깅을 위해서는 로그가 준비되어 있어야 한다. Nginx나 uWSGI에서도 로깅을 해 주기는 하지만, 해 봐야 access log 정도라 크게 도움이 되지 않는다.
하지만 역시나 우리의 Django는 Logging 역시 준비해 놓았다.

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_DIRlogs/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.