T.I.L June 14, 2023 (DRF 프로젝트에 logging 적용)

2023. 6. 14. 00:41T.I.L (Today_I_Learned)

Logging(로깅)


로깅은 프로그램 실행 중에 발생하는 이벤트 및 메시지를 기록하는 것 입니다.

기록된 정보는 나중에 분석, 디버깅, 성능 평가 등을 위해 사용될 수 있습니다.

 

 

프로젝트에 적용한 logging code


LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'verbose': {
            'format': '{asctime} {levelname} {module} {message}',
            'datefmt': '%Y-%m-%d %H:%M',
            'style': '{',
        },
    },
    'handlers': {
        'console': {
            'level': 'INFO',
            'class': 'logging.StreamHandler',
            'formatter': 'verbose',
        },
        'debug_log': {
            'level': 'DEBUG',
            'class': 'logging.handlers.TimedRotatingFileHandler',
            'filename': f'logs/debug/deb__{str_now}.log',
            'formatter': 'verbose',
        },
        'error_log': {
            'level': 'ERROR',
            'class': 'logging.handlers.TimedRotatingFileHandler',
            'filename': f'logs/error/err__{str_now}.log',
            'formatter': 'verbose',
        },
    },
    'loggers': {
        'django.db.backends': {
            'handlers': ['debug_log'],
            'level': 'DEBUG',
            'propagate': True,
        },
        'django.request': {
            'handlers': ['error_log'],
            'level': 'ERROR',
            'propagate': True,
        },
    },
}

 

1. 'version': 로깅 설정의 버전을 지정합니다. 여기서는 1로 설정되어 있습니다.

2. 'disable_existing_loggers': 이미 존재하는 로거를 사용하지 않도록 할지 여부를 지정합니다. False로 설정되어 있으므로 이미 존재하는 로거들을 사용할 수 있습니다.

3. 'formatters': 로깅 메시지의 형식을 정의하는 부분입니다. 여기서는 'verbose'라는 이름의 포맷터를 정의하고 있습니다. 포맷터는 로깅 메시지를 어떻게 표시할지를 결정합니다.

4. 'handlers': 로그 메시지를 받아 처리하는 핸들러를 정의하는 부분입니다. 여기서는 'console', 'debug_log', 'error_log'라는 세 가지 핸들러를 정의하고 있습니다.

  • 'console' 핸들러는 로그 메시지를 콘솔에 출력합니다.
  • 'debug_log' 핸들러는 로그 메시지를 디버그용 로그 파일에 기록합니다. 로그 파일은 일정 주기로 회전됩니다.
    'error_log' 핸들러는 로그 메시지를 에러용 로그 파일에 기록합니다. 로그 파일은 일정 주기로 회전됩니다.

 

5. 'loggers': 실제 로깅을 수행할 로거를 정의하는 부분입니다. 여기서는 'django.db.backends'와 'django.request'라는 두 개의 로거를 정의하고 있습니다.

  • 'django.db.backends' 로거는 Django의 데이터베이스 백엔드에 관련된 로그 메시지를 처리합니다. 해당 로거는 'debug_log' 핸들러를 사용하고 수준(level)은 'DEBUG'로 설정되어 있습니다.
  • 'django.request' 로거는 Django의 HTTP 요청에 관련된 로그 메시지를 처리합니다. 해당 로거는 'error_log' 핸들러를 사용하고 수준(level)은 'ERROR'로 설정되어 있습니다.

 

 

느낀점


팀원 분이 작성해주신 로깅을 통해 디버그 & 에러 메시지 기록을 확인할 수 있었습니다.

얼마 사용하지는 못했지만 개인적으로 로깅의 가장 큰 이점은 에러의 원인을 찾을 때 있었습니다.

아직 더 사용하면서 로깅 사용의 장점을 알아봐야 하겠습니다.

이번 계기를 통해 개발자로서 활용할 수 있는 것과 사용해야 할 것들이 굉장히 많다는 것을 다시 느꼈습니다.