ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Django] Logging - 장고 로그(debug_sql)
    공부/Django 2023. 4. 14. 00:20

    장고를 사용하다보면 print()로 로그를 찍는 방법도 있지만 실제 서비스에서는 절대적으로 사용하 면 안된다고 생각을 하며, 로그를 확인하기 위해서 장고에서는 Logging이 잘 돼 있다고 생각한다.

    - 이전에 Logging 관련 글을  작성했지만 Cloud Watch를 활용해서 작성한 방법을 기록하였습니다.(Cloud Watch에 기록하고 싶으시다면 이전 글을 참고 해주세요.) - 링크


    1. settings.py에 LOGGING을 만듭니다.

    LOGGING = {
        'version': 1,
        'disable_existing_loggers': False,
        'filters': {
            'require_debug_false': {	# DEBUG = False
                '()': 'django.utils.log.RequireDebugFalse',
            },
            'require_debug_true': {		# DEBUG = True
                '()': 'django.utils.log.RequireDebugTrue',
            },
        },
        'formatters': {	
            'test': {
                'format': u'%(asctime)s [%(levelname)-8s] %(funcName)s - %(message)s [%(pathname)s:%(lineno)d] ',
                'datefmt': '%Y-%m-%d %H:%M:%S'
            },
        },
        'handlers': {
            'file': {
                'level': 'DEBUG',
                'filters': ['require_debug_true'],
                'class': 'logging.handlers.RotatingFileHandler',
                'filename': os.path.join(BASE_DIR , 'logs/test.log'),
                'maxBytes': 1024*1024*5,  # 5 MB
                'backupCount': 5,
                'formatter': 'test',
            },
        },
        'loggers': {
            'django': {
                'level': 'INFO',
                'handlers': ['file'],
                'propagate': False,
            },
            'django.db.backends': {
                'level': 'DEBUG',
                'handlers': ['file'],
                'propagate': False,
            },
        },
    }

    - filter : DEBUG가 True, False 인지 여부를 확인하기 위해서 사용하였습니다. (handlers- filters에서는 True일때를 사용하였습니다.)

    - formatters : 로그를 어떻게 출력하고 싶은지 작성하면 됩니다.(여러개의 formatters를 만들어서 사용할 수 있습니다.)

    - handlers : 생성한 로그들을 어디에, 어떤 level까지, 어떤 형식으로 보여주고 저장 할지를 설정하는 곳입니다.

    - loggers :  어떤 서비스의 log를 어떤 level부터 보여줄지 정하는 부분입니다.

     

    전반적으로 설정한다고 생각해 주시면됩니다.

    handlers, loggers를 뜯어보려고 합니다. formatters는 직접 설정을 하시면된다고 생각합니다.(참고 링크)

     

    # handlers

    'handlers': {
            'file': {
                'level': 'DEBUG',
                'filters': ['require_debug_true'],
                'class': 'logging.handlers.RotatingFileHandler',
                'filename': os.path.join(BASE_DIR , 'logs/test.log'),
                'maxBytes': 1024*1024*5,  # 5 MB
                'backupCount': 5,
                'formatter': 'test',
            },
        },

    - file 이라는 이름으로 설정하였습니다. 어떤 이름으로 설정하셔도 상관없습니다.

    - level은 로깅의 단계가 존재 합니다. file로 사용하는 loggers는 DEBUG단계까지 보여 줄 수 있도록 설정 하였습니다.

    (심각도: CRITICAL > ERROR > WARNING > INFO > DEBUG > NOTSET)

    더보기
    CRITICAL: 시스템의 심각한 에러를 나타냅니다. 프로그램의 실행을 중단시켜야 하는 심각한 오류가 발생한 경우에 사용됩니다.
    ERROR: 에러가 발생한 것을 나타냅니다. 프로그램의 실행은 계속될 수 있지만, 에러가 발생했음을 알립니다.
    WARNING: 경고를 나타냅니다. 프로그램의 실행은 계속될 수 있지만, 주의가 필요한 상황임을 알립니다.
    INFO: 정보를 나타냅니다. 프로그램의 실행 상태나 이벤트를 알리는 용도로 사용됩니다.
    DEBUG: 디버깅 정보를 나타냅니다. 개발자가 문제를 해결하기 위해 사용됩니다.
    NOTSET: 로그 수준을 지정하지 않은 경우 사용됩니다. 로그 수준이 가장 낮은 값입니다.

    - 만일, level 단계가 DEBUG까지 필요없으시면 INFO로 설정하시면 됩니다. 그러면 DEBUG 레벨의 로그는 표시되지않습니다.

    - class는 로컬에서 logging을 사용하기 위한 핸들러를 설정하였습니다.

    - filename은 로그가 저장될 위치를 지정하였습니다.

     

    # loggers

    'loggers': {
            'django': {
                'level': 'INFO',
                'handlers': ['file'],
                'propagate': False,
            },
            'django.db.backends': {
                'level': 'DEBUG',
                'handlers': ['file'],
                'propagate': False,
            },
        },

    - 'django', 'django.db.backends' 2가지를 사용 하는 이유는 'django'는 INFO level에 맞는 로그를 남기기 위함입니다.(서버 실행 후 상태나 이벤트를 기록하기 위함) 

    - 'django.db.backedns'는 DEBUG level에 맞는 로그를 남기기 위함입니다.(sql_debug를 사용하기 위해서입니다.)
    - 'django.db.backedns' 를 사용하면 쿼리를 로그에 남길 수 있습니다. (level은 꼭 DEBUG로 설정해야합니다. db.backends는 level이 INFO보다 낮은 DEBUG로 설정 돼 있기 때문입니다.)

     

     

    # 로그 

     

    # 실제 사용된 코드 

    import os
    import logging
    LOGGING = {
        'version': 1,
        'disable_existing_loggers': False,
        'filters': {
            'require_debug_false': {
                '()': 'django.utils.log.RequireDebugFalse',
            },
            'require_debug_true': {
                '()': 'django.utils.log.RequireDebugTrue',
            },
        },
        'formatters': {
            'test': {
                'format': u'%(asctime)s [%(levelname)-8s] %(funcName)s - %(message)s [%(pathname)s:%(lineno)d] ',
                'datefmt': '%Y-%m-%d %H:%M:%S'
            },
        },
        'handlers': {
            'file': {
                'level': 'DEBUG',
                'filters': ['require_debug_true'],
                'class': 'logging.handlers.RotatingFileHandler',
                'filename': os.path.join(BASE_DIR , 'logs/test.log'),
                'maxBytes': 1024*1024*5,  # 5 MB
                'backupCount': 5,
                'formatter': 'test',
            },
        },
        'loggers': {
            'django': {
                'level': 'INFO',
                'handlers': ['file'],
                'propagate': False,
            },
            'django.db.backends': {
                'level': 'DEBUG',
                'handlers': ['file'],
                'propagate': False,
            },
        },
    }
    log = logging.getLogger('django') # django만 getLogger해도 sql_debug도 출력됩니다.

    프린트 대신 로그 사용하는 방법

     

    로그 찍고 싶은 곳에 settings를 import 해서 사용하시면 됩니다. (위에 링크 참조)

     

    [AWS] CloudWatch에 기록하는 방식도 글을 작성하였습니다.
    api요청 할 때마다 로그를 찍을 수 있도록 하는 방법(middleware)을 사용하는 글을 작성하도록 하겠습니다.

     

     

     

     

    - 어떤 문제를 해결하기위해 검색하고 블로그에 작성한 글입니다. 부족한점이 많지만 틀린점이나 부족한점이 있다면 말씀해주시면 감사하겠습니다.

     

     

    Ref.

    https://wikidocs.net/77522

     

    4-14 로깅

    `[완성 소스]` : [github.com/pahkey/jump2django/tree/4-14](https://github.com/pahkey/jump2django/tree/4-…

    wikidocs.net

    https://hikoding.tistory.com/49

     

    Django에서 로깅 사용하기 (로그기록 파일로 남기기)

    안녕하세요 장고로 서버를 구동하고 사이트에 접속하면 콘솔에 로그가 찍힙니다. 실제 서버 구동시 콘솔로 관리하기가 어렵습니다. 파일로 로그를 남겨두면 사이트를 관리하는데 좋겠죠 바로

    hikoding.tistory.com

    https://velog.io/@jusung-c/%EB%A1%9C%EA%B7%B8-%EB%82%A8%EA%B8%B0%EA%B8%B0

     

    로그 남기기

    장고의 로깅은 파이썬의 로깅 체계를 그대로 따르면서 일부만 추가됐다. 파이썬의 로깅 모듈은 로거, 핸들러, 필터, 포맷터 4가지 주요 컴포넌트를 정의하고 있다. 장고의 runserver나 웹 서버에 의

    velog.io

     

    댓글

Designed by Tistory.