Skip to content

kidsnote/django-sqllog

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

24 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

django-sqllog

0. 주의

이 저장소는 공개(public) 저장소입니다.
민감한 정보가 유출되지 않도록 주의 바랍니다.

1. 목적

django.db.connectcursor를 통해 데이터베이스 서버에 전달되는 SQL Query를 로깅합니다.

2. 기능

  • django.db.connect을 통해 전달되는 쿼리 로깅
  • 로깅 기능 런타임 온/오프

3. 로깅 항목

  • sql

    파라미터가 분리된 쿼리문

  • params

    sql에 바인딩될 파라미터

  • many

    여러 개의 Query 구문인지의 여부

  • alias

    settings.DATABASES의 키 값으로써 쿼리가 실행된 DB 식별자

  • duration

    쿼리 수행에 소요된 시간

  • configuration

    사용된 설정값 식별자 ex) web, api 등 conf/settings/env.py 참조

  • traceback

    쿼리 수행 지점까지의 프로그램 콜스택

  • traceback_hash

    traceback의 MD5 해시값

4. 설치

a. https 프로토콜 사용

pip install git+https://github.com/kncray/django-sqllog.git@latest

github 보안 정책에 따라 비밀번호를 이용할 수 없는 경우,

pip install git+https://{YOUR-TOKEN}@github.com/kncray/django-sqllog.git@latest

b. SSH 프로토콜 사용

pip install git+ssh://[email protected]/kncray/django-sqllog.git@latest

5. 설정

a. settings.INSTALLED_APPS 수정

INSTALLED_APPS += [
    'sqllog',
]

b. settings.SQLLOG 생성

SQLLOG = {
    'ENABLED': os.getenv('SQLLOG_ENABLED', True),
    'ENABLE_SENTRY': os.getenv('SQLLOG_ENABLE_SENTRY', False),
    'CONFIG_NAME': 'testing',
    'ENV_FILE_PATH': f'{BASE_DIR}/runtime/sqllog.ini',
    'LOGGING': {
        'formatters': {
            'sqllog': {
                'format': '%(levelname)s %(asctime)s %(message)s',
            },
        },
        'handlers': {
            'sqllog': {
                'class': 'logging.FileHandler',
                'filename': f'{LOG_ROOT}/sql.log',
                'formatter': 'sqllog',
            },
        },
        'loggers': {
            'sqllog': {
                'handlers': ['sqllog'],
                'level': 'INFO',
                'propagate': False,
            },
        }
    }
}

6. 결과

screenshot.20230308T174525.png

7. 기타 참고 사항

  • 설정 파일(settings.SQLLOG['ENV_FILE_PATH'])이 없을 경우 새로 생성 및 비활성화

  • 설정 파일이 없을 경우 로깅 비활성화

  • 설정 파일을 삭제할 경우 로깅 비활성화

  • 설정 파일이 포함된 디렉토리를 삭제할 경우 로깅 비활성화

  • 설정 파일의 내용이 올바르지 않을 경우 로깅 비활성화

  • 프로그램 재시작/재배포 시 설정 파일이 존재하고 활성화로 설정된 경우 로깅 활성화

  • 설정 파일 형식

    [default]
    enabled=True
    sample_rate=1
    max_traceback_strlen=100
    max_query_length=10000
    long_query_time=1
    long_query_length=10000
    
    • max_traceback_strlen

      기본값은 None입니다(Key/Value가 존재하지 않거나 max_traceback_strlen=와 같이 설정).
      traceback 필드의 최대 문자 수를 결정합니다.

    • max_query_length

      기본값은 10000입니다. sql 필드의 최대 문자 수를 결정합니다.
      값을 지정하지 않을 경우(No Value) 쿼리문 전체가 저장됩니다.

    • long_query_time

      단위는 초(sec)이고 기본값은 1입니다.
      값을 지정할 경우 해당 시간 이상으로 걸린 쿼리만 저장됩니다.

    • long_query_length

      기본값은 10000입니다.
      값을 지정할 경우 해당 길이 이상의 쿼리만 저장됩니다.
      단, INSERT, UPDATE 명령은 제외합니다.

  • Logstash로 직접 로깅할 경우 아래와 같이 설정합니다.

    SQLLOG = {
        'ENABLED': os.getenv('SQLLOG_ENABLED', True),
        'ENABLE_SENTRY': os.getenv('SQLLOG_ENABLE_SENTRY', False),
        'CONFIG_NAME': 'testing',
        'ENV_FILE_PATH': f'{BASE_DIR}/runtime/sqllog.ini',
        'LOGGING': {
            'formatters': {
                'sqllog': {
                    'format': '%(levelname)s %(asctime)s %(message)s',
                },
            },
            'handlers': {
                'sqllog': {
                    'class': 'logstash.LogstashHandler',
                    'host': 'localhost',
                    'port': 5959,
                },
            },
            'loggers': {
                'sqllog': {
                    'handlers': ['sqllog'],
                    'level': 'INFO',
                    'propagate': False,
                },
            }
        }
    }

    logstash.LogstashHandlerlogstash.UDPLogstashHandler 와 동일합니다. logstash.TCPLogstashHandler로 변경할 수 있습니다 (참고).