강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

인생은회전목마님의 프로필 이미지
인생은회전목마

작성한 질문수

개발자에게 필요한 로그 관리

로그 고도화하기

body가 아닌 request Parameter는 디버그로 안남기나요?

작성

·

210

1

안녕하세요.

 

강의 잘 듣고 있습니다.

 

강의에서 spring filter를 이용해서 controller 에서 들어온

요청정보들에 대한 log를 찍는걸 보여주셨는데요.

혹시 url 들어온 파라미터는 로그에 찍지않는지 궁금합니다. 그리고 요청마다 body가 안들어오는 경우가 있고, 파라미터만 들어온다던지 경우의 수가 다양할거같은데.. 이럴 때는 필터를 어떤식으로 구성해야하는지 궁금합니다.

답변 2

1

이준형(Foo)님의 프로필 이미지
이준형(Foo)
지식공유자

인생은회전목마 님 안녕하세요~

 

우선 강의에서는 Body에 대한것만 남겨뒀는데, URL을 통해 들어오는 Query Parameter 역시 필요하다면 로깅합니다!

로깅 하는 방법은 아래 '인프런 AI 인턴'이 잘 알려줘서 추가적으로 적어드릴 필요는 없을 것 같습니다.

코드를 sout으로 작성해줬는데, 강의에서 다룬것처럼 로깅 프레임워크 활용하시면 되겠습니다. 😄

 

보통 요청에 대해 로깅을 한다면 일반적으로

 

  • Client IP

  • URL (여기에 Query Parameter를 함께 로깅하기도함)

  • Method

  • Body

  • (필요하다면) Header 중 일부 (User-Agent 같은?)

 

같은 데이터를 남기곤합니다.

이런걸 남기려면 아래처럼 예시를 작성해볼 수 있겠습니다.

import jakarta.servlet.Filter;
import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import jakarta.servlet.http.HttpServletRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import java.io.BufferedReader;
import java.io.IOException;
import java.util.stream.Collectors;

@Component
public class RequestLoggingFilter implements Filter {

    private static final Logger logger = LoggerFactory.getLogger(RequestLoggingFilter.class);

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {

        if (request instanceof HttpServletRequest) {
            HttpServletRequest httpRequest = (HttpServletRequest) request;

            // Client IP
            String clientIp = httpRequest.getRemoteAddr();

            // URL and Query Parameters
            String url = httpRequest.getRequestURL().toString();
            String queryString = httpRequest.getQueryString();

            // HTTP Method
            String method = httpRequest.getMethod();

            // Headers (User-Agent)
            String userAgent = httpRequest.getHeader("User-Agent");

            // Body
            String body = extractBody(httpRequest);

            // Consolidated logging
            logger.info("Request Log: [Client IP: {}, URL: {}, Method: {}, User-Agent: {}, Body: {}]", 
                        clientIp, 
                        url + (queryString != null ? "?" + queryString : ""), 
                        method, 
                        userAgent, 
                        body);
        }

        chain.doFilter(request, response);
    }

    private String extractBody(HttpServletRequest request) {
        try {
            BufferedReader reader = request.getReader();
            return reader.lines().collect(Collectors.joining(System.lineSeparator()));
        } catch (IOException e) {
            logger.error("Failed to read request body", e);
            return "";
        }
    }
}

(ChatGPT가 작성해줬습니다.)

 

참고해보시고, 추가적으로 궁금한 내용 있으면 질문 남겨주세요.

감사합니다.

1

안녕하세요, 인프런 AI 인턴입니다. 인생은회전목마님.

로그 관리는 웹 개발에서 중요한 요소 중 하나입니다. Spring Filter를 사용하여 요청 로깅을 구현할 때, URL 요청 파라미터를 포함하여 다양한 형태의 요청 데이터를 로깅하는 것이 가능합니다.

요청 파라미터 로깅

Spring Filter를 사용하여 URL의 쿼리 파라미터도 포함해서 로깅할 수 있는 방법에 대해 설명해 드릴게요. 특히, 요청마다 Body가 없는 경우나 쿼리 파라미터만 전달될 수 있는 경우 filter 설정을 다르게 구현할 수 있습니다:

  1. Request Parameter 로깅:

    • 필터를 통해 HttpServletRequest 객체에서 getParameterMap() 메서드를 호출하여 모든 요청 파라미터를 가져올 수 있습니다. 이를 통해 URL 쿼리 파라미터를 쉽게 로깅할 수 있습니다.
  2. 조건에 따른 로깅:

    • 요청에 따라 Body와 파라미터의 존재 여부가 다를 수 있기 때문에, 각 조건에 맞춰 필터링 로직을 작성하는 것이 중요합니다. 예를 들어, request.getContentType()이나 request.getContentLength()를 사용하여 Body의 존재 여부를 판단할 수 있습니다.
    • URL 파라미터가 있는 경우에는 보통 GET 요청이며, Body가 포함된 POST 혹은 다른 HTTP 메서드의 경우와 구분하여 로깅을 설계할 수 있습니다.
  3. 구현 예시:

    @Component
    public class LoggingFilter implements Filter {
    
    
       @Override
       public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
               throws IOException, ServletException {
           HttpServletRequest httpServletRequest = (HttpServletRequest) request;
    
    
           // URL 쿼리 파라미터 로깅
           String queryParams = httpServletRequest.getQueryString();
           if (queryParams != null) {
               System.out.println("Query Parameters: " + queryParams);
           }
    
    
           // Request Body 로깅 (필요시)
           // 요청 메서드나 다른 조건에 따라 로깅 선택
    
    
           chain.doFilter(request, response);
       }
    }
    

    이렇게 하면 다양한 조건을 고려하여 로깅을 보다 유연하게 설정할 수 있습니다.

혹시 이와 관련된 추가적인 질문이 있으시면, 아래 링크를 참고해보시면 도움이 될 것입니다:
- Spring Boot에서 Request와 Response 로깅하는 방법
- 로그 설정 및 관리 팁 공유

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

인생은회전목마님의 프로필 이미지
인생은회전목마

작성한 질문수

질문하기