Logging

2025. 2. 28. 02:40Spring Framework/Web on Servlet Stack

Spring MVC에서 로깅(logging)은 애플리케이션의 동작을 추적하고 디버깅하는 데 필수적인 기능입니다.
특히, Spring MVC의 DEBUG 및 TRACE 레벨 로깅가독성이 좋고, 최소한의 정보로도 유용한 디버깅이 가능하도록 설계되어 있습니다.

1. Spring MVC의 로깅 레벨(Log Level)

Spring MVC에서 로그는 다양한 레벨(level)을 지원하며, 목적에 따라 적절한 레벨을 설정할 수 있습니다.

로그 레벨 설명
ERROR 애플리케이션에서 치명적인 오류 발생 시 기록
WARN 애플리케이션이 정상 동작하지만 주의해야 할 사항 기록
INFO 주요 이벤트나 상태 변경 사항을 기록
DEBUG 디버깅을 위해 상세한 정보를 기록
TRACE DEBUG보다 더 상세한 정보를 기록 (추적 목적으로 사용)

📌 DEBUG와 TRACE 로깅은 개발 및 디버깅에 유용하며, 운영 환경에서는 INFO 이하 레벨을 주로 사용합니다.

2. DEBUG 및 TRACE 레벨 로깅

Spring MVC에서 DEBUG 및 TRACE 레벨 로깅은 불필요한 정보가 아닌, 지속적으로 유용한 정보를 제공하는 것이 목표입니다.

📌 DEBUG 레벨의 특징

  • 가독성이 좋은(minimal, human-friendly) 로그를 제공
  • 반복적으로 유용한 정보 중심으로 기록
  • 특정 문제를 디버깅할 때만 필요할 만한 정보는 제외

📌 TRACE 레벨의 특징

  • DEBUG보다 더 상세한 정보를 제공
  • 디버깅이 필요한 경우 특정 상세 로그를 활성화할 수 있음
  • DEBUG 로그와 비교하여 더 세부적인 실행 흐름을 확인 가능

3. Spring MVC에서 DEBUG/TRACE 로그 활성화

Spring MVC의 로깅을 활성화하려면 로깅 프레임워크(Logback, Log4j2 등)를 설정해야 합니다.

1. logback.xml을 이용한 설정 (Spring Boot)

Spring Boot는 디폴트로 Logback을 사용하여 로깅을 관리합니다.

📌 DEBUG 레벨 활성화 (logback.xml)

<configuration>
    <logger name="org.springframework.web" level="DEBUG"/>
    <logger name="org.springframework.web.servlet" level="DEBUG"/>
    <logger name="org.springframework.web.filter" level="DEBUG"/>

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <root level="INFO">
        <appender-ref ref="STDOUT"/>
    </root>
</configuration>

📌 설명

  • org.springframework.web → Spring MVC 관련 로그 활성화
  • org.springframework.web.servlet → DispatcherServlet 관련 로그 활성화
  • org.springframework.web.filter → 필터 관련 로그 활성화
  • 로그 출력 패턴 설정

📌 TRACE 레벨 활성화

<logger name="org.springframework.web.servlet.DispatcherServlet" level="TRACE"/>

➡ DispatcherServlet의 TRACE 로그를 활성화하여 더 자세한 요청 처리 흐름을 확인 가능

2. application.properties를 이용한 설정 (Spring Boot)

Spring Boot에서는 application.properties 또는 application.yml 파일을 이용해 쉽게 설정할 수 있습니다.

📌 DEBUG 레벨 활성화

logging.level.org.springframework.web=DEBUG
logging.level.org.springframework.web.servlet=DEBUG

📌 TRACE 레벨 활성화

logging.level.org.springframework.web.servlet.DispatcherServlet=TRACE

4. 민감한 데이터 보호 (Sensitive Data Logging)

Spring MVC에서 DEBUG 및 TRACE 로그는 요청 파라미터 및 헤더 정보를 포함할 수 있으며, 이는 보안상 위험할 수 있습니다.
예를 들어, 로그인 요청 시 비밀번호가 로그에 기록될 수도 있습니다.

📌 Spring MVC에서는 디폴트로 요청 파라미터 및 헤더 정보를 마스킹하여 보호합니다.
그러나 필요하면 enableLoggingRequestDetails 설정을 통해 전체 요청 정보를 로깅할 수 있습니다.

민감한 데이터 로깅 활성화

DispatcherServletenableLoggingRequestDetails 설정을 true로 변경하면 요청의 모든 정보를 로깅할 수 있음.

📌 Java 설정 예제

import jakarta.servlet.ServletRegistration;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

public class MyInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class<?>[]{AppConfig.class};
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class<?>[]{WebConfig.class};
    }

    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }

    @Override
    protected void customizeRegistration(ServletRegistration.Dynamic registration) {
        // 요청 파라미터 및 헤더 정보를 포함한 디버깅 로그 활성화
        registration.setInitParameter("enableLoggingRequestDetails", "true");
    }
}

📌 설명

  • registration.setInitParameter("enableLoggingRequestDetails", "true")를 추가하면
    요청의 전체 정보를 로깅할 수 있음.
  • 디폴트는 보안상 이유로 요청 파라미터 및 헤더가 마스킹 처리됨.

📌 Spring Boot 환경에서 설정 (application.properties)

spring.mvc.log-request-details=true

➡ Spring Boot에서는 spring.mvc.log-request-details=true로 설정 가능

5. 요청/응답 로깅 필터 추가 (HandlerInterceptor 활용)

보다 상세한 요청 및 응답 정보를 로깅하려면 HandlerInterceptor를 사용하여 직접 로그를 추가할 수도 있습니다.

📌 예제: HandlerInterceptor를 이용한 로깅

import org.springframework.web.servlet.HandlerInterceptor;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class LoggingInterceptor implements HandlerInterceptor {
    private static final Logger logger = LoggerFactory.getLogger(LoggingInterceptor.class);

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        logger.info("요청 URI: {}", request.getRequestURI());
        logger.info("요청 메서드: {}", request.getMethod());
        logger.info("요청 헤더: {}", request.getHeaderNames());
        return true;
    }
}

📌 설명

  • preHandle()에서 요청 URI, HTTP 메서드, 헤더 정보를 로깅
  • 필요에 따라 postHandle()afterCompletion()에서도 응답 데이터를 로깅할 수 있음

🚀 Summary

1️⃣ Spring MVC의 로깅 레벨

  • DEBUG: 필요한 정보만 간결하게 로깅
  • TRACE: 더 상세한 요청/응답 흐름을 로깅

2️⃣ 로깅 활성화 방법

  • logback.xml 또는 application.properties에서 설정 가능
  • logging.level.org.springframework.web=DEBUG 설정으로 활성화

3️⃣ 민감한 데이터 보호

  • 기본적으로 요청 파라미터 및 헤더는 마스킹됨
  • enableLoggingRequestDetails=true를 설정하면 전체 요청 정보 로깅 가능

4️⃣ 추가적인 로깅

  • HandlerInterceptor를 사용하여 요청/응답 로그를 추가할 수도 있음

📌 Spring MVC의 로깅을 효과적으로 활용하면 디버깅과 애플리케이션 모니터링을 효율적으로 할 수 있습니다! 🚀

 

출처 : https://docs.spring.io/spring-framework/reference/web/webmvc/mvc-servlet/logging.html

'Spring Framework > Web on Servlet Stack' 카테고리의 다른 글

CORS  (2) 2025.03.05
URI Links  (0) 2025.03.05
Multipart Resolver  (0) 2025.02.28
View Resolution  (0) 2025.02.28
Exceptions  (0) 2025.02.28