티스토리 뷰
※본 자료는 김석훈, 『파이썬 웹 프로그래밍(개정판)』, 한빛미디어, pp151-218. 를 참고하여 만들었습니다.
6. 로그 남기기
장고의 로깅은 기본적으로 파이썬의 로깅 체계를 그대로 따르면서 일부만 추가되었습니다. 파이썬의 로깅 모듈을 보면 로거, 핸들러, 필터, 포맷터 4가지 주요 컴포넌트를 정의하고 있습니다.
장고는 settings.py 파일에 정의된 LOGGING_CONFIG, LOGGING 항목을 참고하여 로깅에 관련된 설정을 처리합니다. settings.py 파일에 관련 항목이 없더라도 디폴트 로깅 설정으로 처리 되기 때문에 실행되는 시점부터 로그가 출력됩니다.
(1) 로거
로거는 로깅 시스템의 시작점으로, 로그 메세지를 처리하기 위해 메세지를 담아두는 저장소입니다. 모든 로거는 이름과 레벨을 갖게 되는데 이는 로그 메세지의 중요도에 따라 자신이 어느 레벨 이상의 메세지를 처리할지에 대한 기준이 됩니다. 파이썬 로그 레벨은 아래의 표와 같습니다.
로그 레벨 | 정수 값 | 설명 |
NOTSET | 0 | 로그 레벨의 최하위 수준 ,로거 또는 핸들러가 생상될 때는 별도 설정이 없으면 갖는 디폴트 로그 레벨 |
DEBUG | 10 | 디버그 용도로 사용되는 정보 |
INFO | 20 | 일반적이고 보편적인 정보 |
WARNING | 30 | 문제점 중에서 덜 중요한 문제점이 발생 시 이에 대한 정보 |
ERROR | 40 | 문제점 중에서 주요 문제점이 발생시 이에 대한 정보 |
CRITICAL | 50 | 치명적인 문제점이 발생시 이에 대한 정보, 로그 레벨의 최상위 수준 |
로거에 저장되는 메세지를 로그 레코드라고 하며, 로그 레코드 역시 그 메세지의 심각성을 나타내는 로그 레벨을 가집니다. 로그 레코드는 로그 이벤트에 대한 메타 정보도 가질 수 있는데 일례로 스택 트레이스 정보나 에러 코드등을 담을 수 있습니다.
로그 레코드가 로거에 도착하면, 로그 레코드의 로그 레벨과 로거의 로그 레벨을 비교합니다. 로그 레코드의 로그 레벨이 로거 자체의 로그 레벨과 같거나 그보다 높으면 메시지 처리를 계속 진행하고 더 낮으면 그 메세지는 무시됩니다. 이렇게 로그 레코드와 로거의 로그 레벨을 비교하여 메세지 처리를 진행하는 것으로 결정되면 로거는 메시지를 핸들러에게 넘겨줍니다.
(2) 핸들러
핸들러는 로거에 있는 메세지에 무슨 작업을 할지 결정하는 엔진입니다. 즉, 메세지를 화면이나 파일 또는 네트워크 소켓 등 어디에 기록할 것인지와 같은 로그 동작을 정의합니다. 핸들러 역시도 로그레벨을 가지고 있습니다. 로그 레코드의 로그 레벨이 핸들러의 로그 레벨보다 더 낮으면 핸들러는 메세지를 무시합니다. 로거는 핸들러를 여러 개 가질 수 있고, 각 핸들러는 서로 다른 로그 레벨을 가질 수 있습니다.
(3) 필터
로그 레코드가 로거에서 핸들러로 넘겨질 때, 필터를 사용해서 로그 레코드에 추가적인 제어를 할 수 있습니다. 예를 들어, 필터를 추가하여 ERROR 메세지 중에서 특정 소스로부터 오는 메세지만 핸들러로 넘길 수 있습니다. 또한 필터를 사용하면 로그 레코드를 보내기 전에 수정하는 것도 가능합니다. ERROR 로그 레코드를 WARNING 로그 레벨로 낮춰주는 필터를 만들 수도 있습니다. 필터는 체인 방식으로 동작시킬 수도 있습니다.
(4) 포맷터
로그 레코드는 최정적으로 텍스트로 표현되는데, 포맷터는 텍스트로 표현 시 사용할 포맷을 지정해줍니다.
(5) 로거 사용 및 로거 이름 계층화
로그를 기록하기 위해서는 앞서 설명한 로거, 핸들러, 필터, 포맷터 등을 설정한 후에, 코드 내에서 로깅 메소드를 호출하면 됩니다.
# mysite/setting.py
LOGGING= {
'version' : 1,
'disable_existing_loggers' : False,
'handlers' :{
'console':{
'class' : logging.StreamHandler',
},
},
'loggers' :{
'mylogger':{
'handlers' : ['console'],
'level':'INFO'
},
},
}
#some_app/views.py
import logging #파이썬 로깅 모듈 임포트
#settings.py 파일에서 설정된 로거를 취득함
logger = logging.getLogger('mylogger')
def my_view(request, arg1, arg2):
#view logic
if bad_mogo:
logger.error('Something went worng!') # ERROR 레벨의 로그 레코드를 생성함
로거의 이름은 광행적으로 __name__ 구문을 사용하는데, 이는 이 구문이 있는 파일의 파이썬 모듈 경로를 말합니다.
#로거 이름으로 계층화
logger = logging.getLogger('project.intersting.stuff')
도트 방식의 로거 이름은 계층화를 이룹니다. 즉, project.interesting.stuff 로거의 부모는 project.interesting 로거이고, project.interesing 로거의 부모는 project 로거가 됩니다. 참고로 로거의 이름을 빈 문자열 (' ')로 지정하면 파이썬의 최상위 로거(루트 로거)가 됩니다. 로깅 호출은 부모 로거에게 전파되기 때문에 중요합니다. 로그 계층화를 이용하면 로거 트리의 최상단 루트 로거에서 핸들러 하나만 만들어도 하위 로거의 모든 로깅 호출을 잡을 수 있습니다.
로거 객체는 각 로그 레벨별로 로깅 호출 메소드를 갖고 있습니다.
- logger.debug( ) : DEBUG 레벨의 로그 레코드를 생성합니다.
- logger.info( ) : INFO 레벨의 로그 레코드를 생성합니다.
- logger.warning( ) : WARNING 레벨의 로그 레코드를 생성합니다.
- logger.error( ) : ERROR 레벨의 로그 레코드를 생성합니다.
- logger.critical( ) : CRITICAL 레벨의 로그 레코드를 생성합니다.
추가적으로 두 가지 로깅 메소드를 가지고 있습니다.
- logger.log( ) : 원하는 로그 레벨을 정해서 로그 메세지를 생성합니다.
- logger.exception( ) : 익셉션 스택 트레이스 정보를 포함하는 ERROR 레벨의 로그 메세지를 생성합니다.
'컴퓨터공학 및 코딩 > Django Tutorial' 카테고리의 다른 글
Django 핵심기능 -5. 클래스형 뷰 (0) | 2020.04.13 |
---|---|
Django 핵심기능 - 4. 폼 처리하기 (0) | 2020.04.12 |
Django 핵심기능 - 3. 템플릿 시스템 (0) | 2020.04.11 |
Django 핵심기능 - 2. 장고 파이썬 쉘로 조작하기 (0) | 2020.04.09 |
Django 핵심 기능 - 1. Admin 사이트 꾸미기 (0) | 2020.04.09 |
- Total
- Today
- Yesterday
- 당신의 그림자가 울고 있다.
- 알고스팟
- WebProgramming
- AI
- Polls
- word embedding
- NLP
- 융
- 심리학
- 코딩하는 신학생
- Python
- 로버트존슨
- text classification
- 단어표현
- 인공지능
- Mikolov
- lstm
- 분석심리학
- 자연어처리
- web
- 코딩테스트
- 텍스트분류
- CBOW
- 젠심
- word vector
- word2vec
- django
- 그림자
- Tutorial
- Skip-gram
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |