package com.example.micrometerboot.config;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.MDC;
import org.springframework.stereotype.Component;
import org.springframework.web.util.ContentCachingResponseWrapper;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Collections;
import java.util.Map;
import java.util.UUID;
import java.util.stream.Collectors;
@Component
@Slf4j
public class MDCLoggingFilter implements Filter {
final static String _HEADER_NAME = "x-api-id";
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
// get header value in request
HttpServletRequest httpRequest = (HttpServletRequest) servletRequest;
Map<String, String> headers = Collections.list(httpRequest.getHeaderNames())
.stream()
.collect(Collectors.toMap(h -> h, httpRequest::getHeader));
String apiId = headers.get(_HEADER_NAME);
if (apiId == null || apiId.isEmpty()) {
apiId = UUID.randomUUID().toString();
}
// add mdc
MDC.put(_HEADER_NAME, apiId);
log.trace("Request IP address is {}", servletRequest.getRemoteAddr());
log.trace("Request content type is {}", servletRequest.getContentType());
// set header value in response
HttpServletResponse httpServletResponse = (HttpServletResponse) servletResponse;
ContentCachingResponseWrapper responseWrapper = new ContentCachingResponseWrapper(httpServletResponse);
filterChain.doFilter(servletRequest, responseWrapper);
responseWrapper.setHeader(_HEADER_NAME, apiId);
responseWrapper.copyBodyToResponse();
log.trace("Response header is set with uuid {}", responseWrapper.getHeader(_HEADER_NAME));
}
}
[%X{X-API-ID}] 형식으로 넣어준다. <!-- FILE Appender -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH_NAME}</file>
<!-- 일자별로 로그파일 적용하기 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH_NAME}.%d{yyyyMMdd}</fileNamePattern>
<maxHistory>60</maxHistory> <!-- 일자별 백업파일의 보관기간 -->
</rollingPolicy>
<encoder>
<pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5p] [cellookadmin] [%X{x-api-id}] [%F:%line] [%M] : %m%n</pattern>
</encoder>
</appender>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5p] [cellookadmin] [%X{X-API-ID}] [%F:%line] [%M] : %m%n</pattern>
</layout>
</encoder>


FE 개발자와 소통
수많은 로그 중 내가 호출한 Request의 로그만 찾아서 확인하기 쉽다.