diff --git a/Dockerfile b/Dockerfile index 398e124..cef5c0f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -19,4 +19,4 @@ COPY . . EXPOSE 8000 -CMD ["gunicorn", "--workers=3", "--bind=0.0.0.0:8000", "nhn_prj.wsgi:application"] +CMD ["gunicorn", "--workers=3", "--bind=0.0.0.0:8000", "--access-logfile=-", "--error-logfile=-", "--capture-output", "--log-level=info", "nhn_prj.wsgi:application"] diff --git a/nhn_prj/middleware.py b/nhn_prj/middleware.py new file mode 100644 index 0000000..15079f2 --- /dev/null +++ b/nhn_prj/middleware.py @@ -0,0 +1,53 @@ +# nhn_prj/middleware.py +import logging +import time + +logger = logging.getLogger(__name__) + + +class RequestLoggingMiddleware: + """모든 요청을 로깅하는 미들웨어""" + + def __init__(self, get_response): + self.get_response = get_response + + def __call__(self, request): + # 요청 시작 시간 + start_time = time.time() + + # 요청 정보 로깅 + logger.info( + f"[REQUEST] {request.method} {request.path} " + f"| Host: {request.get_host()} " + f"| IP: {self.get_client_ip(request)}" + ) + + # 헤더 로깅 (디버깅용) + nhn_headers = { + k: v for k, v in request.headers.items() + if k.lower().startswith('x-nhn') + } + if nhn_headers: + logger.info(f"[HEADERS] NHN Headers: {nhn_headers}") + + # 응답 처리 + response = self.get_response(request) + + # 응답 시간 계산 + duration = time.time() - start_time + + # 응답 정보 로깅 + logger.info( + f"[RESPONSE] {request.method} {request.path} " + f"| Status: {response.status_code} " + f"| Duration: {duration:.3f}s" + ) + + return response + + def get_client_ip(self, request): + """클라이언트 IP 추출""" + x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR') + if x_forwarded_for: + return x_forwarded_for.split(',')[0].strip() + return request.META.get('REMOTE_ADDR', 'unknown') diff --git a/nhn_prj/settings.py b/nhn_prj/settings.py index 944d80d..435e695 100644 --- a/nhn_prj/settings.py +++ b/nhn_prj/settings.py @@ -38,6 +38,7 @@ INSTALLED_APPS = [ ] MIDDLEWARE = [ + "nhn_prj.middleware.RequestLoggingMiddleware", # 요청 로깅 (맨 위) "corsheaders.middleware.CorsMiddleware", "django.middleware.security.SecurityMiddleware", "django.contrib.sessions.middleware.SessionMiddleware", @@ -240,5 +241,11 @@ LOGGING = { "level": "INFO", "propagate": False, }, + # 요청 로깅 미들웨어 + "nhn_prj.middleware": { + "handlers": ["console"], + "level": "INFO", + "propagate": False, + }, }, } diff --git a/version b/version index 90ab6e9..f9cece5 100644 --- a/version +++ b/version @@ -1 +1 @@ -v0.0.2 \ No newline at end of file +v0.0.3