Django 로그 기록 간단 사용법

Django에서 로그를 간단히 사용하는 방법에 대해 설명합니다.

  1. 프로젝트 생성

django-admin startproject my_django_project

my_django_project/my_django_project/views.py 파일에 다음 내용 추가

import logging

from django.http import HttpResponse


def fun(request):
    logging.info("정보 메시지")
    logging.warning("경고 메시지")
    logging.error("오류 메시지")
    return HttpResponse()

라우팅 설정

my_django_project/my_django_project/urls.py

from django.urls import path
from .views import fun

urlpatterns = [
    path('', fun),
]

기본적으로 warning 수준 이상의 로그만 콘솔에 출력됩니다.

  1. 기본적인 사용법

콘솔에 로그 출력하기 및 레벨 설정

my_django_project/settings.py 파일에 다음 내용 추가

LOGGING = {
    'version': 1,  
    'disable_existing_loggers': False,  
    'handlers': {  
        'console': {  
            'class': 'logging.StreamHandler',  
        },
    },
    'root': {  
        'handlers': ['console'],  
        'level': 'DEBUG',  
    },
}

'disable_existing_loggers': False, # 이미 존재하는 로거를 비활성화 여부

예를 들어, 비활성화하면 utils/autoreload.py의 로그도 출력되지 않습니다.

사용자 정의 로거 추가

my_django_project/settings.py 파일에 LOGGING 내용 수정

LOGGING = {
    'version': 1,  
    'disable_existing_loggers': False,  
    'handlers': {  
        'console': {  
            'class': 'logging.StreamHandler',  
        },
    },
    'root': {  
        'handlers': ['console'],  
        'level': 'DEBUG',  
    },
    'loggers': {  
        'custom_logger': {  
            'handlers': ['console'],  
            'level': 'ERROR',  
            'propagate': False,
        },
    },
}

my_django_project/my_django_project/views.py 파일에 다음 내용 추가

import logging

from django.http import HttpResponse


def fun(request):
    logging.info("정보 메시지")
    logging.warning("경고 메시지")
    logging.error("오류 메시지")
    log = logging.getLogger('custom_logger')
    log.info("사용자 정의 로거 정보 메시지")
    log.warning("사용자 정의 로거 경고 메시지")
    log.error("사용자 정의 로거 오류 메시지")
    return HttpResponse()

사용자 정의 로거는 ERROR 수준 이상의 로그만 출력합니다.

파일에 로그 작성하기

my_django_project/settings.py 파일에 LOGGING 내용 수정

LOGGING = {
    'version': 1,  
    'disable_existing_loggers': False,  
    'handlers': {  
        'console': {  
            'class': 'logging.StreamHandler',  
        },
        'write_file': {  
            'class': 'logging.FileHandler',  
            'filename': './logs/app.log', 
        }
    },
    'root': {  
        'handlers': ['console'],  
        'level': 'DEBUG',  
    },
    'loggers': {  
        'custom_logger': {  
            'handlers': ['console'],  
            'level': 'ERROR',  
            'propagate': False,
        },
        'file_logger': {
            'handlers': ['write_file'],  
            'level': 'DEBUG',  
            'propagate': False,
        }
    },
}

my_django_project/my_django_project/views.py 파일에 다음 내용 추가

import logging

from django.http import HttpResponse


def fun(request):
    logging.info("정보 메시지")
    logging.warning("경고 메시지")
    logging.error("오류 메시지")

    log = logging.getLogger('custom_logger')
    log.info("사용자 정의 로거 정보 메시지")
    log.warning("사용자 정의 로거 경고 메시지")
    log.error("사용자 정의 로거 오류 메시지")

    log = logging.getLogger('file_logger')
    log.info("파일 로거 정보 메시지")
    log.warning("파일 로거 경고 메시지")
    log.error("파일 로거 오류 메시지")
    return HttpResponse()

로그가 ./logs/app.log 파일에 작성됩니다.

로그 형식 지정하기

my_django_project/settings.py 파일에 LOGGING 내용 수정

LOGGING = {
    'version': 1,  
    'disable_existing_loggers': False,  
    'formatters': {  
        'verbose': {
            'format': '[{levelname}][{asctime}][{module}][{process:d}][{thread:d}]{message}',
            'style': '{',  
        },
        'simple': {
            'format': '[{levelname}]{message}',
            'style': '{',  
        },
    },
    'handlers': {  
        'console': {  
            'class': 'logging.StreamHandler',  
            'formatter': 'verbose'  
        },
        'write_file': {  
            'class': 'logging.FileHandler',  
            'filename': './logs/app.log', 
            'formatter': "simple"  
        }
    },
    'root': {  
        'handlers': ['console'],  
        'level': 'DEBUG',  
    },
    'loggers': {  
        'custom_logger': {  
            'handlers': ['console'],  
            'level': 'ERROR',  
            'propagate': False,
        },
        'file_logger': {
            'handlers': ['write_file'],  
            'level': 'DEBUG',  
            'propagate': False,
        }
    },
}

my_django_project/my_django_project/views.py 파일에는 변경 사항이 없습니다.

결과:

root 로거는 모든 로그를 출력합니다.

custom_logger는 ERROR 이상의 로그만 출력합니다.

file_logger는 ./logs/app.log 파일에 모든 로그를 출력합니다.

'propagate': False, # 로그 전달 여부

true로 설정하면 상위 로거로 전달됩니다.

참고:

  • file_logger의 'propagate':을 true로 변경하면 root 로거의 로그도 함께 출력됩니다.

  • custom_logger의 'propagate':을 true로 변경하면 두 번의 로그가 출력됩니다.

propagate 파라미터: propagate=0(로그 출력하지만 전달하지 않음), propagate=1(로그 출력하고 전달함)

필터 추가하기

my_django_project/settings.py 파일에 LOGGING 내용 수정

LOGGING = {
    'version': 1,  
    'disable_existing_loggers': False,  
    'formatters': {  
        'verbose': {
            'format': '[{levelname}][{asctime}][{module}][{process:d}][{thread:d}]{message}',
            'style': '{',  
        },
        'simple': {
            'format': '[{levelname}]{message}',
            'style': '{',  
        },
    },
    'filters': {  
        'require_debug_true': {
            '()': 'django.utils.log.RequireDebugTrue',  
        },
    },
    'handlers': {  
        'console': {  
            'class': 'logging.StreamHandler',  
            'formatter': 'verbose',  
            'filters': ["require_debug_true"]  
        },
        'write_file': {  
            'class': 'logging.FileHandler',  
            'filename': './logs/app.log', 
            'formatter': "simple"  
        }
    },
    'root': {  
        'handlers': ['console'],  
        'level': 'DEBUG',  
    },
    'loggers': {  
        'custom_logger': {  
            'handlers': ['write_file'],  
            'level': 'ERROR',  
            'propagate': False,
        },
        'file_logger': {
            'handlers': ['write_file'],  
            'level': 'DEBUG',  
            'propagate': False,
        }
    },
}

DEBUG=False일 때 console은 출력되지 않음(필터 때문).

원문 코드는 다음과 같습니다:

사용자 정의 필터:

my_django_project/my_django_project/filter_log.py 파일에 입력 내용

import logging


class CustomFilterLog(logging.Filter):
    def filter(self, record):
        if 'c-' not in record.msg:  
            return False
        return True

메시지에 'c-'가 없으면 로그를 기록하지 않습니다.

my_django_project/settings.py 파일에 LOGGING 내용 수정

LOGGING = {
    'version': 1,  
    'disable_existing_loggers': False,  
    'formatters': {  
        'verbose': {
            'format': '[{levelname}][{asctime}][{module}][{process:d}][{thread:d}]{message}',
            'style': '{',  
        },
        'simple': {
            'format': '[{levelname}]{message}',
            'style': '{',  
        },
    },
    'filters': {  
        'require_debug_true': {
            '()': 'django.utils.log.RequireDebugTrue',  
        },
        'custom_filter_log': {
            '()': 'my_django_project.filter_log.CustomFilterLog',  
        }
    },
    'handlers': {  
        'console': {  
            'class': 'logging.StreamHandler',  
            'formatter': 'verbose',  
            'filters': ["custom_filter_log"]  
        },
        'write_file': {  
            'class': 'logging.FileHandler',  
            'filename': './logs/app.log', 
            'formatter': "simple"  
        }
    },
    'root': {  
        'handlers': ['console'],  
        'level': 'DEBUG',  
    },
    'loggers': {  
        'custom_logger': {  
            'handlers': ['write_file'],  
            'level': 'ERROR',  
            'propagate': False,
        },
        'file_logger': {
            'handlers': ['write_file'],  
            'level': 'DEBUG',  
            'propagate': False,
        }
    },
}

my_django_project/my_django_project/views.py 파일에 다음 내용 추가

import logging

from django.http import HttpResponse
from django.utils.log import RequireDebugTrue


def fun(request):
    logging.info('c- 화하하하, 기록해주세요')
    logging.info("정보 메시지")
    logging.warning("경고 메시지")
    logging.error("오류 메시지")
    log = logging.getLogger('custom_logger')
    log.info("사용자 정의 로거 정보 메시지")
    log.warning("사용자 정의 로거 경고 메시지")
    log.error("사용자 정의 로거 오류 메시지")

    log = logging.getLogger('file_logger')
    log.info("파일 로거 정보 메시지")
    log.warning("파일 로거 경고 메시지")
    log.error("파일 로거 오류 메시지")
    return HttpResponse()

  1. 개인용 설정

LOG_NAME = Path(BASE_DIR).joinpath("logs", 'app.log')
if not Path(LOG_NAME).parent.exists():
    print(f"로그 디렉토리 생성: {Path(LOG_NAME).absolute()}")
    os.makedirs(Path(LOG_NAME).parent)
LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,  
    'formatters': {  
        "verbose": {
            "format": "[{levelname}][{asctime}][{pathname}:{lineno}][process:{process:d}][thread:{thread:d}]{message}",
            "style": "{",
        },
        "simple": {
            "format": "[{levelname}]{message}",
            "style": "{",
        },
    },
    'filters': {
    },
    'handlers': {  
        'RotatingFileHandler': {  
            'level': 'INFO',  
            'class': 'logging.handlers.RotatingFileHandler',  
            'filename': LOG_NAME,  
            'maxBytes': 1024 * 1024 * 5,  
            'backupCount': 20,  
            'formatter': 'verbose',  
            'encoding': "utf-8"
        },
        'console': {  
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',  
            'formatter': 'simple'
        },
    },
    'loggers': {
        'console': {
            'handlers': ['console'],
            'level': 'DEBUG',
            'propagate': False,
        },
        'rotating_file': {
            'handlers': ['console', 'RotatingFileHandler'],  
            'level': 'INFO',  
            'propagate': False,  
        },
        'root': {
            'handlers': ['console', 'RotatingFileHandler'],  
            'level': 'INFO',  
            'propagate': False,  
        }
    }
}

출력 결과:

로그 형식 파라미터

포맷 설명 출력
%(name)s 로거 이름 root
%(levelno)s 숫자 형태의 로그 레벨 20
%(levelname)s 텍스트 형태의 로그 레벨 INFO
%(filename)s 로그 기록 호출의 소스 파일의 파일 이름 views.py
%(pathname)s 로그 기록 호출의 소스 파일의 경로 이름 D:\Project\PythonProject\my_django_project\my_django_project\views.py
%(funcName)s 로그 기록 호출의 함수 이름 fun
%(module)s 로그 기록 호출의 모듈 이름 views
%(lineno)s 로그 기록 호출의 줄 번호 11
%(created)s 로그 기록 실행 시간 1653027145.2251844
%(asctime)s 날짜와 시간 2022-05-20 14:12:25,225
%(msecs)s 밀리초 부분 225.18444061279297
%(thread)d 스레드 ID 8080
%(threadName)s 스레드 이름 Thread-1
%(process)d 프로세스 ID 12780
%(message)s 로그 메시지 정보 메시지

태그: Django 로깅 파이썬 개발 웹 애플리케이션

9월 2일 13:19에 게시됨