admin: 로깅 공통 필터 추가

This commit is contained in:
geonhos 2024-05-20 08:53:14 +09:00
parent b275e12d8c
commit e5f350630f
1 changed files with 80 additions and 0 deletions

View File

@ -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));
}
}