[라이브러리] logging (로깅, 로그)
로그 레벨
Level | Value | When to use |
DEBUG | 10 | 상세한 정보 |
INFO | 20 | 예상대로 작동하는 지 확인 |
WARNING | 30 | 예상치 못한 일이 발생했거나 가까운 미래에 발생할 문제 표시 |
ERROR | 40 | 소프트웨어가 함수를 실행 시키지 못하는 심각한 문제 |
CRITICAL | 50 | 소프트웨어가 작동하지 못하는 심각한 문제 |
- 기본 레벨 : WARNING
구성 요소
1. Logger
- 로그를 생성하는 메서드 제공 logging.getLogger(‘name’)
- 로그 생성 method : Logger.debug(), Logger.info(), Logger.warning(), Logger.error(), Logger.critical()
- 로그 설정 method : Logger.setLevel(), Logger.addHandler(), Logger.removeHandler(), Logger.addFilter(), Logger.removeFilter()
import logging
logger = logging.getLogger(__name__) # __name__ : 모듈이름 (board.py일 경우 board가 됨)
logger.setLevel(logging.INFO)
2. Formatter
- 로그의 포맷 설정
import logging
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
formatter = logging.Formatter('%(asctime)s:%(module)s:%(levelname)s:%(message)s', '%Y-%m-%d %H:%M:%S')
3. Handler
- 로그 메시지를 지정된 대상으로 전달하는 역할
- 로그 정보를 출력할 위치 설정 ex) log파일
- 대표적인 종류
(1) StreamHandler : 스트림(콘솔창)에 로그 메시지 기록
import logging
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO) # INFO 레벨 이상의 로그를 Handler들에게 전달
formatter = logging.Formatter('%(asctime)s:%(module)s:%(levelname)s:%(message)s', '%Y-%m-%d %H:%M:%S')
stream_handler = logging.StreamHandler()
stream_handler.setLevel(logging.INFO)
stream_handler.setFormatter(formatter)
logger.addHandler(stream_handler)
logger.info('This is an INFO message')
# This is an INFO message
(2) FileHandler : 특정 파일에 로그 메시지 기록
import logging
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO) # INFO 레벨 이상의 로그를 Handler들에게 전달
formatter = logging.Formatter('%(asctime)s:%(module)s:%(levelname)s:%(message)s', '%Y-%m-%d %H:%M:%S')
file_handler = logging.FileHandler('dummy.log')
file_handler.setLevel(logging.INFO)
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)
logger.info('This is an INFO message')
logging.yml (로그 설정파일)
: 로그 설정파일을 json, yml 등으로 모듈화 시킬 수 있음.
{
'version': 1,
# 기존의 로깅 설정을 비활성화 할 것인가?
'disable_existing_loggers': False,
# 포맷터
# 로그 레코드는 최종적으로 텍스트로 표현됨
# 이 텍스트의 포맷 형식 정의
# 여러 포맷 정의 가능
'formatters': {
'standard': {
'format': "[%(asctime)s] %(levelname)s [%(name)s:%(lineno)s] %(message)s",
'datefmt': "%Y-%m-%d %H:%M:%S"
},
'format1': {
'format': '%(levelname)s %(message)s'
},
},
# 핸들러
# 로그 레코드로 무슨 작업을 할 것인지 정의
# 여러 핸들러 정의 가능
'handlers': {
# 로그 파일을 만들어 텍스트로 로그레코드 저장
'null': {
'level': 'DEBUG',
'class': 'logging.NullHandler',
},
'file': {
'level': 'DEBUG',
'class': 'logging.handlers.TimedRotatingFileHandler',
'filename': os.path.join(LOG_DIR, 'django.log'),
'formatter': 'format1',
'when': 'D',
'interval': 1,
'backupCount': 30,
},
'request': {
'level': 'DEBUG',
'class': 'logging.handlers.TimedRotatingFileHandler',
'filename': os.path.join(LOG_DIR, 'request.log'),
'formatter': 'format1',
'when': 'D',
'interval': 1,
'backupCount': 30,
},
# 콘솔(터미널)에 출력
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler',
'formatter': 'format1',
}
},
# 로거
# 로그 레코드 저장소
# 로거를 이름별로 정의
'loggers': {
'django': {
'handlers': ['file', 'console'],
'level': LOG_LEVEL,
'propagate': True,
},
'django.request': {
'handlers': ['request', 'console'],
'level': LOG_LEVEL,
'propagate': False,
},
},
}