로그 레벨

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,
            },
        },
}