수학과의 좌충우돌 프로그래밍

[Django] Logging 설정 및 SQL 쿼리 확인 본문

웹프로그래밍/Django

[Django] Logging 설정 및 SQL 쿼리 확인

ssung.k 2020. 8. 15. 17:30

log 란?

로그란 운영체제나 다른 소프트웨어가 실행 중에 발생하는 이벤트나 각기 다른 사용자의 통신 소프트웨어에 발생하는 모든 상황을 기록하는 데이터입니다.

개발, 마케팅, 기획, 디자인 등 여러 분야에서 로그데이터는 유용하게 사용될 수 있습니다.

특히 개발 영역에서는 해당 데이터를 통해 다음과 같은 활용이 가능합니다.

  • 버그 수집 및 트래킹
  • 롤백 및 대응 등에 대한 의사결정 판단의 근거로 활용
  • 특정 기능에 대한 사용자 진단

Django를 통해 개발을 하면서도 이러한 로그를 남기고 추후에 활용할 수 있습니다.

이번 포스팅에서는 Django에서의 logging에 대해서 알아보도록 합시다.

 

python logging

django에서는 python 내장 logging 모듈을 사용합니다. 자세한 내용은 아래서 확인할 수 있습니다.

https://docs.python.org/3/library/logging.html#module-logging

 

logging — Logging facility for Python — Python 3.8.5 documentation

logging — Logging facility for Python Source code: Lib/logging/__init__.py This module defines functions and classes which implement a flexible event logging system for applications and libraries. The key benefit of having the logging API provided by a s

docs.python.org

 

python logging은 다음과 같이 네 부분으로 구성이 됩니다.

  • Loggers
  • Handlers
  • Filters
  • Formatters

Loggers

Logger는 logging시스템의 진입점으로 메세지를 쓸 수 있는 버컷입니다.

이 때 메세지는 다음과 같은 로그 레벨을 가질 수 있습니다.

  • DEBUG : 디버깅을 위한 정보
  • INFO : 일반 시스템 정보
  • WARNING : minor한 문제에 대한 정보
  • ERROR : major한 문제에 대한 정보
  • CRITICAL : critical한 문제에 대한 정보

Logger에 메세지가 들어오면 메세지의 로그 레벨과 Logger의 로그 레벨을 비교합니다.

메세지의 로그 레벨이 Logger의 로그 레벨 이상이면 메세지가 추가됩니다.

예를 들어 INFO Logger에는 DEBUG를 제외한 모든 나머지 로그 레벨의 메시지가 전부 들어올 수 있습니다.

 

Handlers

Handler는 Logger의 각 메세지에 발생하는 일을 결정하는 엔진입니다.

화면, 파일 또는 네트워크 소켓에 메시지를 쓰는 것과 같은 특정 로깅 동작을 설명합니다.

Handler도 로그 레벨이 있으며 동일하게 동작합니다.

 

Filters

Filter는 Logger에서 Handler로 전달되는 로그 레코드에 대한 추가 제어를 제공합니다.

 

Formatter

로그 데이터들을 텍스트로 렌더링 되는데 그 때의 형식을 지정합니다.

 

 

logging 사용하기

이제 django에서 logging을 어떻게 사용할 지 보도록 합시다.

우선 두 가지로 구분이 되는데 settings에서 logging을 설정하는 부분과 logging하는 부분으로 나뉘어집니다.

 

logging

이 부분은 아주 간단히 예시 하나만 봐도 쉽게 이해할 수 있습니다.

import logging
logger = logging.getLogger(__name__)


def my_view(request):
    logger.debug(f'{self.request.user}')
    # 생략

 

상단 부에서 logger를 정의합니다.

getLogger의 인자로는 string의 값이 올 수 있는데 __name__ 을 통해 현재 모듈의 파일명으로 이름을 지정하였습니다.

그 후에는 로직에서 호출을 할 수 있고 호출하는 방식은 다음과 같습니다.

  • logger.debug()
  • logger.info()
  • logger.warning()
  • logger.error()
  • logger.critical()

 

logging setting

이제 설정하는 방법에 대해서 알아봅시다.

이 역시 예시를 통해 알아보겠습니다.

from os.path import join

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'fileFormat': {
            'format': '[%(asctime)s] %(levelname)s [%(name)s:%(lineno)s] %(message)s',
            'datefmt': '%d/%b/%Y %H:%M:%S'
        }
    },
    'handlers': {
        'file': {
            'level': 'DEBUG',
            'class': 'logging.FileHandler',
            'filename': join(BASE_DIR, 'logs/logfile.log'),
            'formatter': 'fileFormat'
        },
        'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
        },

    },
    'loggers': {
        'post': {
            'handlers': ['file', 'console'],
            'level': 'DEBUG',
        },
        'django.db.backends': {
            'handlers': ['file', 'console'],
            'level': 'DEBUG',
        },
    }
}
  • version : 버전 정보로서 현재까지 1정보 밖에 존재하지 않습니다.
  • disable_existing_loggers : True일 경우 기본 구성의 logger들이 비활성화 됩니다.
  • formatters : 로그 데이터들을 텍스트로 렌더링 되는데 그 때의 형식을 지정합니다.
  • handlers : 어떤 방식으로 logging할지를 지정할 수 있습니다. 위 예시에서는 두 개의 handlers가 존재하여 file에 기록하는 file handlers 와 console에 출력하는 console handlers 가 있습니다.
  • loggers : logger를 정의합니다. 앱이름을 통해 지정할 수 도 있으며 내장 logger를 사용할 수 도 있습니다. 위의 django.db.backends 는 db와의 상호작용과 관련된 메세지로 sql을 확인할 수 있습니다.

 

기타 추가적인 내용은 django document에서 확인 가능합니다.

https://docs.djangoproject.com/en/3.1/topics/logging/

 

Logging | Django documentation | Django

Django The web framework for perfectionists with deadlines. Overview Download Documentation News Community Code Issues About ♥ Donate

docs.djangoproject.com

 

Comments