728x90
반응형
현재 : 멀티모듈 상태, swagger 설정 완료
들어오는 리퀘스트 정보를 기록,
나가는 기록을 로그로 찍는다.
doFilter 기준으로 들어오고 나가는 정보에 대한 기록을 남긴다.
filter package - LoggerFilter 생성
package org.delivery.api.filter;
import jakarta.servlet.*;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.util.ContentCachingRequestWrapper;
import org.springframework.web.util.ContentCachingResponseWrapper;
import java.io.IOException;
@Component
@Slf4j
public class LoggerFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
//형변환, request, response 를 HttpServlet 으로 형변환 시켜서 넘긴다.
var req = new ContentCachingRequestWrapper((HttpServletRequest) request);
var res = new ContentCachingResponseWrapper((HttpServletResponse) response);
//컨트롤러, 인터셉터 등 필터 뒤에 있는 것들은 랩핑된 객체를 받는다
chain.doFilter(req, res);
//request 정보
var headerNames = req.getHeaderNames();
var headerValues = new StringBuilder(); //key value
headerNames.asIterator().forEachRemaining(headerKey->{
var headerValue= req.getHeader(headerKey);
headerValues
.append("[")
.append(headerKey)
.append(":")
.append(headerValue)
.append("] ");
});
var requestBody = new String(req.getContentAsByteArray());
var uri = req.getRequestURI();
var method = req.getMethod();
//들어왔을 때 로그
log.info(">>uri : {}, method: {}, header: {}, body : {}", uri, method, headerValues, requestBody);
//response 정보
var responseHeaderValues = new StringBuilder();
res.getHeaderNames().forEach(headerKey->{
var headerValue = res.getHeader(headerKey);
responseHeaderValues
.append("[")
.append(headerKey)
.append(":")
.append(headerValue)
.append("] ");
});
var responseBody = new String(res.getContentAsByteArray());
//나갈때 로그
log.info("<<<uri: {}, method: {}, header: {}, body : {}", uri, method, responseHeaderValues, responseBody);
//이거 없으면 res body가 없이 간다
res.copyBodyToResponse();
}
}
728x90
'JAVA > 프로젝트' 카테고리의 다른 글
배달 플랫폼 백엔드 개발: Api Error code 적용 (1) | 2024.05.20 |
---|---|
배달 플랫폼 백엔드 개발: API 공통 Spec 적용 (0) | 2024.05.20 |
MVC 기반 온라인 쇼핑 카트 구현하기: DB 설계 (0) | 2024.05.05 |
Spring Boot: JPA 연관관계 설정하기 -2, 최신순 정렬, 삭제된 게시글 제외 하고 조회 (0) | 2024.04.27 |
Spring Boot: JPA 연관관계 설정하기, Dto, Converter (0) | 2024.04.27 |