diff --git a/src/main/java/com/bio/bio_backend/global/filter/HttpLoggingFilter.java b/src/main/java/com/bio/bio_backend/global/filter/HttpLoggingFilter.java index fd525b7..0bd92b0 100644 --- a/src/main/java/com/bio/bio_backend/global/filter/HttpLoggingFilter.java +++ b/src/main/java/com/bio/bio_backend/global/filter/HttpLoggingFilter.java @@ -6,6 +6,7 @@ import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; +import org.springframework.core.annotation.Order; import org.springframework.web.filter.OncePerRequestFilter; import org.springframework.web.util.ContentCachingRequestWrapper; import org.springframework.web.util.ContentCachingResponseWrapper; @@ -14,9 +15,11 @@ import java.io.IOException; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.util.*; +import org.slf4j.MDC; @Slf4j @Component +@Order(2) public class HttpLoggingFilter extends OncePerRequestFilter { private static final int MAX_LOG_BODY = 10 * 1024; // 10 KB @@ -38,7 +41,7 @@ public class HttpLoggingFilter extends OncePerRequestFilter { : new ContentCachingResponseWrapper(response); log.info("********************************************************************************"); - log.info("* [START] HTTP LOGGING"); + log.info("* [START] HTTP LOGGING | TRACE ID: {}", getCurrentTraceId()); log.info("* Method: {} | URI: {}", wrappedRequest.getMethod(), wrappedRequest.getRequestURI()); log.info("* Headers: {}", getRequestHeaders(wrappedRequest)); log.info("********************************************************************************"); @@ -151,4 +154,13 @@ public class HttpLoggingFilter extends OncePerRequestFilter { || path.equals("/favicon.ico") || path.startsWith("/actuator/health"); } + + /** + * 현재 스레드의 TRACE ID를 반환합니다. + * @return TRACE ID 또는 "N/A" + */ + private String getCurrentTraceId() { + String traceId = MDC.get("traceId"); + return traceId != null ? traceId : "N/A"; + } } diff --git a/src/main/java/com/bio/bio_backend/global/filter/TraceIdFilter.java b/src/main/java/com/bio/bio_backend/global/filter/TraceIdFilter.java new file mode 100644 index 0000000..b91647e --- /dev/null +++ b/src/main/java/com/bio/bio_backend/global/filter/TraceIdFilter.java @@ -0,0 +1,51 @@ +package com.bio.bio_backend.global.filter; + +import org.slf4j.MDC; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; +import org.springframework.web.filter.OncePerRequestFilter; + +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.UUID; + +@Component +@Order(1) +public class TraceIdFilter extends OncePerRequestFilter { + + private static final String TRACE_ID_HEADER = "X-Trace-Id"; + private static final String TRACE_ID_MDC_KEY = "traceId"; + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) + throws ServletException, IOException { + + try { + // 헤더에서 TRACE ID를 가져오거나 새로 생성 + String traceId = request.getHeader(TRACE_ID_HEADER); + if (traceId == null || traceId.trim().isEmpty()) { + traceId = generateTraceId(); + } + + // MDC에 TRACE ID 설정 + MDC.put(TRACE_ID_MDC_KEY, traceId); + + // 응답 헤더에 TRACE ID 추가 + response.addHeader(TRACE_ID_HEADER, traceId); + + filterChain.doFilter(request, response); + + } finally { + // 요청 처리 완료 후 MDC 정리 + MDC.remove(TRACE_ID_MDC_KEY); + } + } + + private String generateTraceId() { + // UUID 기반 TRACE ID 생성 (8자리로 축약) + return UUID.randomUUID().toString().substring(0, 8); + } +} diff --git a/src/main/java/com/bio/bio_backend/global/utils/TraceIdUtils.java b/src/main/java/com/bio/bio_backend/global/utils/TraceIdUtils.java new file mode 100644 index 0000000..27c3187 --- /dev/null +++ b/src/main/java/com/bio/bio_backend/global/utils/TraceIdUtils.java @@ -0,0 +1,27 @@ +package com.bio.bio_backend.global.utils; + +import org.slf4j.MDC; + +/** + * TRACE ID 관리를 위한 유틸리티 클래스 + */ +public class TraceIdUtils { + + private static final String TRACE_ID_KEY = "traceId"; + + /** + * 현재 스레드의 TRACE ID를 반환합니다. + * @return TRACE ID 또는 null + */ + public static String getCurrentTraceId() { + return MDC.get(TRACE_ID_KEY); + } + + /** + * TRACE ID가 존재하는지 확인합니다. + * @return TRACE ID 존재 여부 + */ + public static boolean hasTraceId() { + return getCurrentTraceId() != null; + } +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 31078e2..faefe87 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -32,7 +32,7 @@ spring.jpa.hibernate.ddl-auto=none spring.jpa.open-in-view=false spring.jpa.show-sql=false spring.jpa.properties.hibernate.format_sql=true -spring.jpa.properties.hibernate.highlight_sql=true +spring.jpa.properties.hibernate.highlight_sql=false spring.jpa.properties.hibernate.use_sql_comments=false # 배치 처리 설정 diff --git a/src/main/resources/logback-spring.xml b/src/main/resources/logback-spring.xml index 1eab898..64c736d 100644 --- a/src/main/resources/logback-spring.xml +++ b/src/main/resources/logback-spring.xml @@ -3,7 +3,7 @@ - %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n + %d{yyyy-MM-dd HH:mm:ss} [%thread] [%X{traceId}] %-5level %logger{36} - %msg%n @@ -21,7 +21,7 @@ 1GB - %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n + %d{yyyy-MM-dd HH:mm:ss} [%thread] [%X{traceId}] %-5level %logger{36} - %msg%n @@ -40,7 +40,7 @@ 500MB - %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n + %d{yyyy-MM-dd HH:mm:ss} [%thread] [%X{traceId}] %-5level %logger{36} - %msg%n