diff --git a/poc/admin/src/main/java/com/bpgroup/poc/admin/fitler/LoggingFilter.java b/poc/admin/src/main/java/com/bpgroup/poc/admin/fitler/LoggingFilter.java new file mode 100644 index 0000000..5bf0224 --- /dev/null +++ b/poc/admin/src/main/java/com/bpgroup/poc/admin/fitler/LoggingFilter.java @@ -0,0 +1,80 @@ +package com.bpgroup.poc.admin.fitler; + +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; +import org.springframework.web.filter.OncePerRequestFilter; +import org.springframework.web.util.ContentCachingRequestWrapper; +import org.springframework.web.util.ContentCachingResponseWrapper; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.stream.Stream; + +@Slf4j +@Order(Ordered.HIGHEST_PRECEDENCE) +@Component +public class LoggingFilter extends OncePerRequestFilter { + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { + customDoFilter(new ContentCachingRequestWrapper(request), new ContentCachingResponseWrapper(response), filterChain); + } + + protected void customDoFilter(ContentCachingRequestWrapper request, ContentCachingResponseWrapper response, FilterChain filterChain) throws ServletException, IOException { + String sessionId = request.getSession().getId(); + + try { + loggingRequest(request, sessionId); + filterChain.doFilter(request, response); + } finally { + loggingResponse(response, sessionId); + response.copyBodyToResponse(); + } + } + + private void loggingRequest(ContentCachingRequestWrapper request, String sessionId) { + log.info("session ID: {} Request - method: {} uri: {}", sessionId, request.getMethod(), request.getRequestURI()); + log.info("session ID: {} Request - params: {}", sessionId, new String(request.getContentAsByteArray(), StandardCharsets.UTF_8)); + } + + private void loggingResponse(ContentCachingResponseWrapper response, String sessionId) { + log.info("Session ID: {} Response - status: {} Content-Type: {}", sessionId, response.getStatus(), response.getContentType()); + + if (isLoggingContentType(response.getContentType())) { + log.info("Session ID: {} Response - body: {}", sessionId, new String(response.getContentAsByteArray(), StandardCharsets.UTF_8)); + } + + } + + /** + * 로깅을 제외할 content type 추가 + */ + private boolean isLoggingContentType(String contentType) { + return Stream.of( + "text/html" + ).noneMatch(contentType::contains); + } + + /** + * 필터를 제외할 URI + */ + @Override + protected boolean shouldNotFilter(HttpServletRequest request) { + return Stream.of( + "/login", + "/logout", + "/error", + "/css", + "/js", + "/images", + "/favicon.ico", + "/common/modal", + "/font" + ).anyMatch(s -> request.getRequestURI().contains(s)); + } +}