Django에서 logging 사용하기

이상해씨·2023년 8월 23일
0

장고 (Django)

목록 보기
16/38

Django에서의 log

  • logging은 시스템의 상태, 에러를 기록 및 관리해주는 것을 의미. ( logging 포스터 참고)
  • Django 프레임워크는 로그(log)를 관리해주는 자체 기능을 가짐 (python logging 모듈을 사용할 필요가 없음.)
  • settings.py에서 로깅에 대한 정의

DEFAULT_LOGGING 설정

1) version 설정

  • DEBUG=False : 프로덕션 환경에 디버그 모드가 비활성화되어 디버깅 정보나 에러 메시지가 노출되지 않음. 프로덕션 환경에서는 보안 및 성능 측면에서 안전하게 운영할 수 있도록 도움
  • ALLOWED_HOSTS : 허용할 호스트 정보 입력
  • version에는 고정값 1을 설정해야 함
  • 다른 값 입력시 Value Error 발생
  • logging 모듈이 업데이트되도 현재 설정을 보장해줌
DEBUG = False

ALLOWED_HOSTS = ['*'] # 나중에 서버정보는 분리하기 (보안이슈)

DEFAULT_LOGGING = {
    'version': 1,
}

2) disable_existing_loggers

  • True 설정시 기존에 설정된 로거를 사용하지 않게 됨으로 False로 설정
DEFAULT_LOGGING = {
    'disable_existing_loggers': False,
}

3) filters

  • 특정 조건의 로그를 추출하기 위해 사용
  • require_debug_falseDEBUG =False를 판단
  • require_debug_trueDEBUG =true를 판단
  • django.utils.log.RequireDebugFalsedjango.utils.log.RequireDebugTrue 클래스를 호출하여 DEBUG의 True, False 조건을 판단
'filters': {
        'require_debug_false': { # debug = false 판단
            '()': 'django.utils.log.RequireDebugFalse',
        },
        'require_debug_true': { # debug = true 판단
            '()': 'django.utils.log.RequireDebugTrue',
    },
},

4) formatters

  • 로그 출력 형식 정의
  • server_time : 서버 시간
  • message : 출력 내용
  • 'style'이 들어갈 경우 {}형식으로 formatters 작성. 없을 경우 %{}s형식으로 작성.
  'formatters': {
        'django.server': {
            '()': 'django.utils.log.ServerFormatter',
            'format': '[{server_time}] {message}',
            'style': '{',
        },
    },

5) handlers

  • 로그 출력 방법 정의
    1) console : 콘솔에 로그 출력.
    2) django.server : python manage.py runserver로 작동하는 개발 서버에서만 사용하는 핸들러. 콘솔에 로그 출력.
 'handlers': {
        'console': {
            'level': 'INFO',
            'filters': ['require_debug_true'],
            'class': 'logging.StreamHandler',
        },
        'django.server': {
            'level': 'INFO',
            'class': 'logging.StreamHandler',
            'formatter': 'django.server',
        },
        '<핸들러 이름>': {
            'level': 'ERROR',
            'filters': ['require_debug_false'],
            'class': 'django.utils.log.<핸들러 종류>'
        },
    },

6) loggers

  • 로거의 이름
  • DEFUALT_LOGGINH 설정 로거들
    1) django : 장고 프레임워크가 사용하는 로거. 로그레벨 INFO 이상시 로그 출력
    2) django.server : 개발서버가 사용하는 로거. 로그레벨 INFO 이상시 로그 출력
    'propagate': False는 django.server가 출력하는 로그를 django 로거로 전달하지 않는다는 의미.
    'propagate': True로 설정시, 최상위 패키지명이 django로 동일하기 때문에 django.server 하위 패키지에서 출력하는 로그가 django.server 로거에도 출력되고 django 로거에도 출력되어 이중으로 출력.
   'loggers': {
        'django': {
            'handlers': ['console', '<핸들러 이름>'],
            'level': 'INFO',
        },
        'django.server': {
            'handlers': ['django.server'],
            'level': 'INFO',
            'propagate': False,
        },
    }

Django에서 사용

1) settings.py에 logging 설정

# settinfs.py

DEFAULT_LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'filters': {
        'require_debug_false': {
            '()': 'django.utils.log.RequireDebugFalse',
        },
        'require_debug_true': {
            '()': 'django.utils.log.RequireDebugTrue',
        },
    },
    'formatters': {
        'django.server': {
            '()': 'django.utils.log.ServerFormatter',
            'format': '[{server_time}] {message}',
            'style': '{',
        },
    },
    'handlers': {
        'console': {
            'level': 'INFO',
            'filters': ['require_debug_true'],
            'class': 'logging.StreamHandler',
        },
        'django.server': {
            'level': 'INFO',
            'class': 'logging.StreamHandler',
            'formatter': 'django.server',
        },
        'mail_admins': {
            'level': 'ERROR',
            'filters': ['require_debug_false'],
            'class': 'django.utils.log.AdminEmailHandler'
        },
    },
    'loggers': {
        'django': {
            'handlers': ['console', 'mail_admins'],
            'level': 'INFO',
        },
        'django.server': {
            'handlers': ['django.server'],
            'level': 'INFO',
            'propagate': False,
        },
    }
}

2) formatter 추가

  • asctime : 현재 시간
  • levelname : 로그의 레벨(debug, info, warning, error, critical)
  • name : 로거명
  • message : 출력 내용
'standard': {
            'format': '%(asctime)s [%(levelname)s] %(name)s: %(message)s'
        },

3) handler 추가 및 설정

  • level : 출력 레벨 (DEBUG>INFO>WARMING>CRITICAL)
  • filters : DEBUG = False 또는 True인 운영 환경에서 사용
  • class : 파일 핸들러로 RotatingFileHandler 사용. RotatingFileHandler는 파일 크기가 설정한 크기보다 커지면 파일 뒤에 인덱스를 붙여서 백업. 로그가 무한히 증가되더라도 일정 개수의 파일로 롤링(Rolling)되어 로그 파일이 너무 커져서 디스크가 꽉 차는 위험 방지.
  • filename : 로그 파일명은 logs 디렉터리에 mysite.log로 설정
  • maxBytes : 로그 파일의 최대 크기.
  • backupCount : 롤링되는 파일의 개수.
  • formatter : 포맷 종류

    📌로그 롤링(Log Rolling)
    : 로그 파일의 크기나 개수에 따라 일정한 기준을 충족하면 새로운 로그 파일을 생성하고, 기존의 로그 파일을 보관하거나 삭제하는 프로세스를 의미

3-1) 핸들러 추가

(... 생략 ...)
LOGGING = {
    (... 생략 ...)
    'handlers': {
        'console': {
            'level': 'INFO',
            'filters': ['require_debug_true'],
            'class': 'logging.StreamHandler',
        },
        'django.server': {
            'level': 'INFO',
            'class': 'logging.StreamHandler',
            'formatter': 'django.server',
        },
        'mail_admins': {
            'level': 'ERROR',
            'filters': ['require_debug_false'],
            'class': 'django.utils.log.AdminEmailHandler'
        },
        'file': {
            'level': 'INFO',
            'filters': ['require_debug_false'],
            'class': 'logging.handlers.<핸들러 종류>',
            'filename': BASE_DIR / 'logs/mysite.log',
            'maxBytes': 1024*1024*5,  # 5 MB
            'backupCount': 5,
            'formatter': 'standard',
        },
    },
    (... 생략 ...)
}

3-2)핸들러 설정

LOGGING = {
    (... 생략 ...)
    'loggers': {
        'django': {
            'handlers': ['console', 'mail_admins', 'file'],
            'level': 'INFO',
        },
        'django.server': {
            'handlers': ['django.server'],
            'level': 'INFO',
            'propagate': False,
        },
    }
}
  • 최종 settings.py
DEFAULT_LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'filters': {
        'require_debug_false': {
            '()': 'django.utils.log.RequireDebugFalse',
        },
        'require_debug_true': {
            '()': 'django.utils.log.RequireDebugTrue',
        },
    },
    'formatters': {
        'django.server': {
            '()': 'django.utils.log.ServerFormatter',
            'format': '[{server_time}] {message}',
            'style': '{',
        },
        'standard': {
            'format': '%(asctime)s [%(levelname)s] %(name)s: %(message)s'
        },
    },
    'handlers': {
        'console': {
            'level': 'INFO',
            'filters': ['require_debug_true'],
            'class': 'logging.StreamHandler',
        },
        'django.server': {
            'level': 'INFO',
            'class': 'logging.StreamHandler',
            'formatter': 'django.server',
        },
        'mail_admins': {
            'level': 'ERROR',
            'filters': ['require_debug_false'],
            'class': 'django.utils.log.AdminEmailHandler'
        },
        'file': {
            'level': 'INFO',
            'filters': ['require_debug_false'],
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': BASE_DIR / 'logs/mysite.log',
            'maxBytes': 1024*1024*5,  # 5 MB
            'backupCount': 5,
            'formatter': 'standard',
        },
    },
    'loggers': {
        'django': {
            'handlers': ['console', 'mail_admins','file'],
            'level': 'INFO',
        },
        'django.server': {
            'handlers': ['django.server'],
            'level': 'INFO',
            'propagate': False,
        },
    }
}

4) log 디렉토리 생성

  • mysite 안에 log를 관리하는 logs 디렉토리 생성
# mysite 위치
mkdir logs

5) .gitignore 파일에 logs 디렉토리 추가

  • .gitignore에 logs

6) 함수 호출하기

  • import logging
  • logger 생성
  • 원하는 클래스 및 함수에서 원하는 레벨로 logger에 정보를 주는 코드 생성 (logger.info)
import logging
logger = logging.getLogger('django')# djanfo logger 실행

def function():
	logger.info(ext)
    return ext


참고

profile
공부에는 끝이 없다

0개의 댓글