diff --git a/src/main/java/umc/th/juinjang/config/ApiFilterConfig.java b/src/main/java/umc/th/juinjang/config/ApiFilterConfig.java index cf6e6bfa..e0ba5428 100644 --- a/src/main/java/umc/th/juinjang/config/ApiFilterConfig.java +++ b/src/main/java/umc/th/juinjang/config/ApiFilterConfig.java @@ -7,7 +7,7 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.Ordered; -import umc.th.juinjang.controller.monitoring.APILoggerFilter; +import umc.th.juinjang.monitoring.ApiLoggerFilter; @Configuration @Slf4j @@ -17,9 +17,9 @@ public class ApiFilterConfig { private List excludedUrls; @Bean - public FilterRegistrationBean loggingFilter() { - FilterRegistrationBean registrationBean = new FilterRegistrationBean<>(); - registrationBean.setFilter(new APILoggerFilter(excludedUrls)); + public FilterRegistrationBean loggingFilter() { + FilterRegistrationBean registrationBean = new FilterRegistrationBean<>(); + registrationBean.setFilter(new ApiLoggerFilter(excludedUrls)); registrationBean.setOrder(Ordered.HIGHEST_PRECEDENCE); // 순서 설정 registrationBean.setUrlPatterns(List.of("/*")); return registrationBean; diff --git a/src/main/java/umc/th/juinjang/controller/monitoring/APILoggerPrinter.java b/src/main/java/umc/th/juinjang/controller/monitoring/APILoggerPrinter.java deleted file mode 100644 index 8cbe628f..00000000 --- a/src/main/java/umc/th/juinjang/controller/monitoring/APILoggerPrinter.java +++ /dev/null @@ -1,19 +0,0 @@ -package umc.th.juinjang.controller.monitoring; - -import static umc.th.juinjang.utils.LoggerProvider.getLogger; - -import java.util.List; -import org.slf4j.Logger; -import org.springframework.stereotype.Component; - -@Component -public class APILoggerPrinter { - private static final Logger logger = getLogger(APILoggerPrinter.class); - - public APILoggerPrinter() { - } - - public void print(APILoggerGenerator apiLoggerGenerator) { - logger.info(apiLoggerGenerator.generateLog()); - } -} diff --git a/src/main/java/umc/th/juinjang/controller/monitoring/CustomContentCachingHttpRequestWrapper.java b/src/main/java/umc/th/juinjang/controller/monitoring/CustomContentCachingHttpRequestWrapper.java deleted file mode 100644 index 5b85b6fb..00000000 --- a/src/main/java/umc/th/juinjang/controller/monitoring/CustomContentCachingHttpRequestWrapper.java +++ /dev/null @@ -1,57 +0,0 @@ -package umc.th.juinjang.controller.monitoring; - -import static umc.th.juinjang.utils.LoggerProvider.getLogger; - -import jakarta.servlet.ReadListener; -import jakarta.servlet.ServletInputStream; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletRequestWrapper; -import java.io.ByteArrayInputStream; -import org.slf4j.Logger; - -public class CustomContentCachingHttpRequestWrapper extends HttpServletRequestWrapper { - - private final Logger logger = getLogger(CustomContentCachingHttpRequestWrapper.class); - private final byte[] cachedBody; - - public CustomContentCachingHttpRequestWrapper(HttpServletRequest request) { - super(request); - byte[] tempBody = new byte[0]; - try { - tempBody = request.getInputStream().readAllBytes(); - } catch (Exception e) { - logger.error("CustomContentCachingHttpRequestWrapper init error {}", e.getMessage()); - } finally { - this.cachedBody = tempBody; - } - } - - @Override - public ServletInputStream getInputStream() { - ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(cachedBody); - return new ServletInputStream() { - @Override - public int read() { - return byteArrayInputStream.read(); - } - - @Override - public boolean isFinished() { - return byteArrayInputStream.available() <= 0; - } - - @Override - public boolean isReady() { - return true; - } - - @Override - public void setReadListener(ReadListener readListener) { - } - }; - } - - public byte[] getCachedBody() { - return this.cachedBody; - } -} diff --git a/src/main/java/umc/th/juinjang/controller/monitoring/APILoggerGenerator.java b/src/main/java/umc/th/juinjang/monitoring/ApiLogGenerator.java similarity index 67% rename from src/main/java/umc/th/juinjang/controller/monitoring/APILoggerGenerator.java rename to src/main/java/umc/th/juinjang/monitoring/ApiLogGenerator.java index d0fe23ce..2755f0e9 100644 --- a/src/main/java/umc/th/juinjang/controller/monitoring/APILoggerGenerator.java +++ b/src/main/java/umc/th/juinjang/monitoring/ApiLogGenerator.java @@ -1,15 +1,15 @@ -package umc.th.juinjang.controller.monitoring; +package umc.th.juinjang.monitoring; import static umc.th.juinjang.utils.LoggerProvider.getLogger; import org.slf4j.Logger; import org.slf4j.MDC; -public abstract class APILoggerGenerator { +public abstract class ApiLogGenerator { - protected static final Logger logger = getLogger(APILoggerGenerator.class); + protected static final Logger logger = getLogger(ApiLogGenerator.class); - public APILoggerGenerator() { + public ApiLogGenerator() { } protected StringBuilder getBaseLogInfo() { diff --git a/src/main/java/umc/th/juinjang/monitoring/ApiLogPrinter.java b/src/main/java/umc/th/juinjang/monitoring/ApiLogPrinter.java new file mode 100644 index 00000000..bade2c7e --- /dev/null +++ b/src/main/java/umc/th/juinjang/monitoring/ApiLogPrinter.java @@ -0,0 +1,18 @@ +package umc.th.juinjang.monitoring; + +import static umc.th.juinjang.utils.LoggerProvider.getLogger; + +import org.slf4j.Logger; +import org.springframework.stereotype.Component; + +@Component +public class ApiLogPrinter { + private static final Logger logger = getLogger(ApiLogPrinter.class); + + public ApiLogPrinter() { + } + + public void print(ApiLogGenerator apiLogGenerator) { + logger.info(apiLogGenerator.generateLog()); + } +} diff --git a/src/main/java/umc/th/juinjang/controller/monitoring/APIRequestLoggerGenerator.java b/src/main/java/umc/th/juinjang/monitoring/ApiLogRequestLogGenerator.java similarity index 81% rename from src/main/java/umc/th/juinjang/controller/monitoring/APIRequestLoggerGenerator.java rename to src/main/java/umc/th/juinjang/monitoring/ApiLogRequestLogGenerator.java index db0d58ce..2082d004 100644 --- a/src/main/java/umc/th/juinjang/controller/monitoring/APIRequestLoggerGenerator.java +++ b/src/main/java/umc/th/juinjang/monitoring/ApiLogRequestLogGenerator.java @@ -1,15 +1,16 @@ -package umc.th.juinjang.controller.monitoring; +package umc.th.juinjang.monitoring; import jakarta.servlet.http.HttpServletRequest; import java.nio.charset.StandardCharsets; import java.util.Collections; import java.util.stream.Collectors; +import org.springframework.web.util.ContentCachingRequestWrapper; -public class APIRequestLoggerGenerator extends APILoggerGenerator{ +public class ApiLogRequestLogGenerator extends ApiLogGenerator { - private final CustomContentCachingHttpRequestWrapper request; + private final ContentCachingRequestWrapper request; - public APIRequestLoggerGenerator(CustomContentCachingHttpRequestWrapper request) { + public ApiLogRequestLogGenerator(ContentCachingRequestWrapper request) { this.request = request; } @@ -22,7 +23,7 @@ public String generateLog() { logBuilder.append("[method] ").append(request.getMethod()).append(" "); logBuilder.append("[uri] ").append(getQuery()).append(" "); logBuilder.append("[headers] ").append(getHeadersAsString(request)).append(" "); - logBuilder.append("[requestBody] ").append(getBody(request.getCachedBody())).append(" "); + logBuilder.append("[requestBody] ").append(getBody(request.getContentAsByteArray())).append(" "); return logBuilder.toString(); } diff --git a/src/main/java/umc/th/juinjang/controller/monitoring/APIResponseLoggerGenerator.java b/src/main/java/umc/th/juinjang/monitoring/ApiLogResponseGenerator.java similarity index 87% rename from src/main/java/umc/th/juinjang/controller/monitoring/APIResponseLoggerGenerator.java rename to src/main/java/umc/th/juinjang/monitoring/ApiLogResponseGenerator.java index d3317df5..8a1856b9 100644 --- a/src/main/java/umc/th/juinjang/controller/monitoring/APIResponseLoggerGenerator.java +++ b/src/main/java/umc/th/juinjang/monitoring/ApiLogResponseGenerator.java @@ -1,14 +1,14 @@ -package umc.th.juinjang.controller.monitoring; +package umc.th.juinjang.monitoring; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import java.nio.charset.StandardCharsets; import org.springframework.web.util.ContentCachingResponseWrapper; -public class APIResponseLoggerGenerator extends APILoggerGenerator { +public class ApiLogResponseGenerator extends ApiLogGenerator { private final ContentCachingResponseWrapper response; - public APIResponseLoggerGenerator(ContentCachingResponseWrapper response) { + public ApiLogResponseGenerator(ContentCachingResponseWrapper response) { this.response = response; } diff --git a/src/main/java/umc/th/juinjang/monitoring/ApiLoggerFactory.java b/src/main/java/umc/th/juinjang/monitoring/ApiLoggerFactory.java new file mode 100644 index 00000000..54212873 --- /dev/null +++ b/src/main/java/umc/th/juinjang/monitoring/ApiLoggerFactory.java @@ -0,0 +1,19 @@ +package umc.th.juinjang.monitoring; + +import org.springframework.web.util.ContentCachingRequestWrapper; +import org.springframework.web.util.ContentCachingResponseWrapper; + +public class ApiLoggerFactory { + + public void createRequestLogger(ContentCachingRequestWrapper request) { + getApiLogPrinter().print(new ApiLogRequestLogGenerator(request)); + } + + public void createResponseLogger(ContentCachingResponseWrapper response) { + getApiLogPrinter().print(new ApiLogResponseGenerator(response)); + } + + private ApiLogPrinter getApiLogPrinter() { + return new ApiLogPrinter(); + } +} diff --git a/src/main/java/umc/th/juinjang/controller/monitoring/APILoggerFilter.java b/src/main/java/umc/th/juinjang/monitoring/ApiLoggerFilter.java similarity index 53% rename from src/main/java/umc/th/juinjang/controller/monitoring/APILoggerFilter.java rename to src/main/java/umc/th/juinjang/monitoring/ApiLoggerFilter.java index b999f12e..1506c333 100644 --- a/src/main/java/umc/th/juinjang/controller/monitoring/APILoggerFilter.java +++ b/src/main/java/umc/th/juinjang/monitoring/ApiLoggerFilter.java @@ -1,4 +1,4 @@ -package umc.th.juinjang.controller.monitoring; +package umc.th.juinjang.monitoring; import static umc.th.juinjang.utils.LoggerProvider.getLogger; import static umc.th.juinjang.utils.LoggerProvider.registerRequestId; @@ -13,35 +13,35 @@ import org.slf4j.MDC; import org.springframework.util.AntPathMatcher; import org.springframework.web.filter.OncePerRequestFilter; +import org.springframework.web.util.ContentCachingRequestWrapper; import org.springframework.web.util.ContentCachingResponseWrapper; @Slf4j -public class APILoggerFilter extends OncePerRequestFilter { - - private final APILoggerPrinter apiLoggerPrinter = new APILoggerPrinter(); - private static final Logger logger = getLogger(APILoggerFilter.class); - private final AntPathMatcher pathMatcher = new AntPathMatcher(); +public class ApiLoggerFilter extends OncePerRequestFilter { + private static final Logger logger = getLogger(ApiLoggerFilter.class); + private final ApiLoggerFactory apiLoggerFactory; private final List EXCLUDED_URLS; - public APILoggerFilter(List EXCLUDED_URLS) { + public ApiLoggerFilter(List EXCLUDED_URLS) { this.EXCLUDED_URLS = EXCLUDED_URLS; + this.apiLoggerFactory = new ApiLoggerFactory(); } @Override - protected void doFilterInternal(HttpServletRequest servletRequest, HttpServletResponse servletResponse, FilterChain chain ) { - CustomContentCachingHttpRequestWrapper requestWrapper = new CustomContentCachingHttpRequestWrapper(servletRequest); - ContentCachingResponseWrapper responseWrapper = new ContentCachingResponseWrapper(servletResponse); + protected void doFilterInternal(HttpServletRequest servletRequest, HttpServletResponse servletResponse, FilterChain chain) { + ContentCachingRequestWrapper request = new ContentCachingRequestWrapper(servletRequest); + ContentCachingResponseWrapper response = new ContentCachingResponseWrapper(servletResponse); registerRequestId(UUID.randomUUID().toString()); try { - if (shouldNotFilter(requestWrapper)) { - chain.doFilter(requestWrapper, responseWrapper); + if (shouldNotFilter(request)) { + chain.doFilter(request, response); return; } - apiLoggerPrinter.print(new APIRequestLoggerGenerator(requestWrapper)); - chain.doFilter(requestWrapper, responseWrapper); - apiLoggerPrinter.print(new APIResponseLoggerGenerator(responseWrapper)); - responseWrapper.copyBodyToResponse(); + chain.doFilter(request, response); + apiLoggerFactory.createRequestLogger(request); + apiLoggerFactory.createResponseLogger(response); + response.copyBodyToResponse(); } catch (Exception e) { logger.error("APILogger 필터 오류"); } finally { @@ -51,6 +51,7 @@ protected void doFilterInternal(HttpServletRequest servletRequest, HttpServletRe @Override protected boolean shouldNotFilter(HttpServletRequest request) { + AntPathMatcher pathMatcher = new AntPathMatcher(); return EXCLUDED_URLS.stream().anyMatch(pattern -> pathMatcher.match(pattern, request.getRequestURI())); } } diff --git a/src/main/java/umc/th/juinjang/utils/LoggerProvider.java b/src/main/java/umc/th/juinjang/utils/LoggerProvider.java index 5e94b3ce..af68be00 100644 --- a/src/main/java/umc/th/juinjang/utils/LoggerProvider.java +++ b/src/main/java/umc/th/juinjang/utils/LoggerProvider.java @@ -5,7 +5,7 @@ import org.slf4j.MDC; import org.springframework.beans.factory.annotation.Value; -public class LoggerProvider { // 커스텀 로거 생성 메서드 +public class LoggerProvider { private static final String REQUEST_ID = "request_id"; private static final String USER_ID = "user_id"; diff --git a/src/main/resources/logback-dev.xml b/src/main/resources/logback-dev.xml index 4185066a..dee5fd9b 100644 --- a/src/main/resources/logback-dev.xml +++ b/src/main/resources/logback-dev.xml @@ -12,7 +12,7 @@ - + diff --git a/src/main/resources/logback-local.xml b/src/main/resources/logback-local.xml index 4866531b..794a255e 100644 --- a/src/main/resources/logback-local.xml +++ b/src/main/resources/logback-local.xml @@ -12,7 +12,7 @@ - + diff --git a/src/main/resources/logback-prod.xml b/src/main/resources/logback-prod.xml index 7516e4e8..7ce64d90 100644 --- a/src/main/resources/logback-prod.xml +++ b/src/main/resources/logback-prod.xml @@ -12,7 +12,7 @@ - +