diff --git a/src/main/kotlin/roomescape/common/log/HttpRequestLoggingFilter.kt b/src/main/kotlin/roomescape/common/log/HttpRequestLoggingFilter.kt new file mode 100644 index 00000000..24f937f4 --- /dev/null +++ b/src/main/kotlin/roomescape/common/log/HttpRequestLoggingFilter.kt @@ -0,0 +1,39 @@ +package roomescape.common.log + +import io.github.oshai.kotlinlogging.KLogger +import io.github.oshai.kotlinlogging.KotlinLogging +import jakarta.servlet.FilterChain +import jakarta.servlet.http.HttpServletRequest +import jakarta.servlet.http.HttpServletResponse +import org.slf4j.MDC +import org.springframework.web.filter.OncePerRequestFilter +import org.springframework.web.util.ContentCachingRequestWrapper +import org.springframework.web.util.ContentCachingResponseWrapper + +private val log: KLogger = KotlinLogging.logger {} + +class HttpRequestLoggingFilter( + private val messageConverter: ApiLogMessageConverter +) : OncePerRequestFilter() { + override fun doFilterInternal( + request: HttpServletRequest, + response: HttpServletResponse, + filterChain: FilterChain + ) { + log.info { messageConverter.convertToHttpRequestMessage(request) } + + val cachedRequest = ContentCachingRequestWrapper(request) + val cachedResponse = ContentCachingResponseWrapper(response) + + val startTime = System.currentTimeMillis() + MDC.put("startTime", startTime.toString()) + + try { + filterChain.doFilter(cachedRequest, cachedResponse) + cachedResponse.copyBodyToResponse() + } finally { + MDC.remove("startTime") + MDC.remove("member_id") + } + } +}