From d6335f83594250fe953616af81328641b4ac0315 Mon Sep 17 00:00:00 2001 From: KWY Date: Wed, 1 Jan 2025 15:02:34 +0900 Subject: [PATCH 1/8] =?UTF-8?q?[fix]=20=EB=B2=84=EC=A0=84=EC=97=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 14c6c55..815329e 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ plugins { } group = 'com.asap' -version = '1.3.0' +version = '1.3.1' java { sourceCompatibility = '17' From 12781d5905c3f6bd542737f9749326e36264aa67 Mon Sep 17 00:00:00 2001 From: KWY Date: Sat, 18 Jan 2025 20:43:05 +0900 Subject: [PATCH 2/8] =?UTF-8?q?#338=20[feat]=20mdc=20filter=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/common/log/MDCFilter.java | 24 +++++++++++++++++++ src/main/resources/logback-spring.xml | 2 +- 2 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/asap/server/presentation/common/log/MDCFilter.java diff --git a/src/main/java/com/asap/server/presentation/common/log/MDCFilter.java b/src/main/java/com/asap/server/presentation/common/log/MDCFilter.java new file mode 100644 index 0000000..c016050 --- /dev/null +++ b/src/main/java/com/asap/server/presentation/common/log/MDCFilter.java @@ -0,0 +1,24 @@ +package com.asap.server.presentation.common.log; + +import jakarta.servlet.Filter; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; +import java.io.IOException; +import java.util.UUID; +import org.slf4j.MDC; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; + +@Order(1) +@Component +public class MDCFilter implements Filter { + @Override + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) + throws IOException, ServletException { + MDC.put("traceId", UUID.randomUUID().toString()); + filterChain.doFilter(servletRequest, servletResponse); + MDC.clear(); + } +} diff --git a/src/main/resources/logback-spring.xml b/src/main/resources/logback-spring.xml index e4ece4e..878cfaf 100644 --- a/src/main/resources/logback-spring.xml +++ b/src/main/resources/logback-spring.xml @@ -1,7 +1,7 @@ + value="[%d{yyyy-MM-dd'T'HH:mm:ss}:%-4relative] - [%X{traceId}] %green([%thread]) %highlight(%-5level) %boldWhite([%C.%M:%yellow(%L)]) - %msg%n"/> From 57740afb67c9a0e05b1d0a3b6d27545ac55b2efb Mon Sep 17 00:00:00 2001 From: KWY Date: Sat, 18 Jan 2025 20:46:06 +0900 Subject: [PATCH 3/8] =?UTF-8?q?#338=20[feat]=20=EA=B3=B5=ED=86=B5=20loggin?= =?UTF-8?q?g=20format=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../advice/ControllerExceptionAdvice.java | 1 - .../common/log/LoggingAspect.java | 68 +++++++++++++++++++ 2 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/asap/server/presentation/common/log/LoggingAspect.java diff --git a/src/main/java/com/asap/server/presentation/common/advice/ControllerExceptionAdvice.java b/src/main/java/com/asap/server/presentation/common/advice/ControllerExceptionAdvice.java index c3137cf..2b0b2d2 100644 --- a/src/main/java/com/asap/server/presentation/common/advice/ControllerExceptionAdvice.java +++ b/src/main/java/com/asap/server/presentation/common/advice/ControllerExceptionAdvice.java @@ -170,7 +170,6 @@ protected ErrorResponse handleInternalErrorException(final InternalErrorExceptio @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) @ExceptionHandler(Exception.class) protected ErrorResponse handleException(final Exception error, final HttpServletRequest request) throws IOException { - log.error("================================================NEW==============================================="); log.error(error.getMessage(), error); slackUtil.sendAlert(error, request); return ErrorResponse.error(Error.INTERNAL_SERVER_ERROR); diff --git a/src/main/java/com/asap/server/presentation/common/log/LoggingAspect.java b/src/main/java/com/asap/server/presentation/common/log/LoggingAspect.java new file mode 100644 index 0000000..1410451 --- /dev/null +++ b/src/main/java/com/asap/server/presentation/common/log/LoggingAspect.java @@ -0,0 +1,68 @@ +package com.asap.server.presentation.common.log; + +import jakarta.servlet.http.HttpServletRequest; +import java.util.stream.Collectors; +import java.util.stream.IntStream; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Pointcut; +import org.aspectj.lang.reflect.MethodSignature; +import org.springframework.stereotype.Component; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +@Aspect +@Component +@Slf4j +public class LoggingAspect { + + private static final String REQUEST_FORMAT = "URI : %s | Request : %s"; + private static final String RESPONSE_FORMAT = "URI : %s | Response : %s"; + + @Pointcut("execution(* com.asap.server.presentation.controller..*(..))") + public void serviceLoggingExecute() { + } + + @Pointcut("execution(* com.asap.server.presentation.common.advice.ControllerExceptionAdvice..*(..))") + public void exceptionLoggingExecute() { + } + + @Around("com.asap.server.presentation.common.log.LoggingAspect.serviceLoggingExecute()") + public Object logging(ProceedingJoinPoint proceedingJoinPoint) throws Throwable { + final HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest(); + final String uri = request.getRequestURI(); + final String args = getParameterNameAndArgs(proceedingJoinPoint); + + log.info(String.format(REQUEST_FORMAT, uri, args)); + final Object returnValue = proceedingJoinPoint.proceed(proceedingJoinPoint.getArgs()); + log.info(String.format(RESPONSE_FORMAT, uri, returnValue)); + + return returnValue; + } + + @Around("com.asap.server.presentation.common.log.LoggingAspect.exceptionLoggingExecute()") + public Object errorLogging(ProceedingJoinPoint proceedingJoinPoint) throws Throwable { + final Object returnValue = proceedingJoinPoint.proceed(proceedingJoinPoint.getArgs()); + + final HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest(); + final String uri = request.getRequestURI(); + log.info(String.format(RESPONSE_FORMAT, uri, returnValue)); + return returnValue; + } + + private String getParameterNameAndArgs(final ProceedingJoinPoint proceedingJoinPoint) { + final MethodSignature methodSignature = (MethodSignature) proceedingJoinPoint.getSignature(); + final String[] parameterNames = methodSignature.getParameterNames(); + final Object[] args = proceedingJoinPoint.getArgs(); + + if (parameterNames == null || args == null || parameterNames.length != args.length) { + return "[]"; + } + + return IntStream.range(0, parameterNames.length) + .mapToObj(i -> parameterNames[i] + " : " + args[i]) + .collect(Collectors.joining(", ", "[", "]")); + } +} From 8cb2a570d5802972c20e93f69496b185b12f5d9c Mon Sep 17 00:00:00 2001 From: KWY Date: Sat, 18 Jan 2025 20:47:33 +0900 Subject: [PATCH 4/8] =?UTF-8?q?#338=20[chore]=20=ED=8C=A8=ED=82=A4?= =?UTF-8?q?=EC=A7=80=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/presentation/config/WebConfig.java | 2 +- .../config/aspect/LoggingAspect.java | 78 ------------------- .../CustomHttpServletRequestWrapper.java | 5 +- .../CustomServletWrappingFilter.java | 11 ++- .../DuplicatedInterceptor.java | 3 +- .../config/filter/HttpRequestConfig.java | 18 ----- 6 files changed, 11 insertions(+), 106 deletions(-) delete mode 100644 src/main/java/com/asap/server/presentation/config/aspect/LoggingAspect.java rename src/main/java/com/asap/server/presentation/{common/wrapper => config/duplicate}/CustomHttpServletRequestWrapper.java (96%) rename src/main/java/com/asap/server/presentation/config/{filter => duplicate}/CustomServletWrappingFilter.java (67%) rename src/main/java/com/asap/server/presentation/config/{interceptor => duplicate}/DuplicatedInterceptor.java (94%) delete mode 100644 src/main/java/com/asap/server/presentation/config/filter/HttpRequestConfig.java diff --git a/src/main/java/com/asap/server/presentation/config/WebConfig.java b/src/main/java/com/asap/server/presentation/config/WebConfig.java index 4227716..df284ca 100644 --- a/src/main/java/com/asap/server/presentation/config/WebConfig.java +++ b/src/main/java/com/asap/server/presentation/config/WebConfig.java @@ -1,6 +1,6 @@ package com.asap.server.presentation.config; -import com.asap.server.presentation.config.interceptor.DuplicatedInterceptor; +import com.asap.server.presentation.config.duplicate.DuplicatedInterceptor; import com.asap.server.presentation.config.resolver.meeting.MeetingPathVariableResolver; import com.asap.server.presentation.config.resolver.user.UserIdResolver; import lombok.RequiredArgsConstructor; diff --git a/src/main/java/com/asap/server/presentation/config/aspect/LoggingAspect.java b/src/main/java/com/asap/server/presentation/config/aspect/LoggingAspect.java deleted file mode 100644 index 4e5d5d8..0000000 --- a/src/main/java/com/asap/server/presentation/config/aspect/LoggingAspect.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.asap.server.presentation.config.aspect; - -import com.asap.server.presentation.common.wrapper.CustomHttpServletRequestWrapper; -import jakarta.servlet.http.HttpServletRequest; -import lombok.extern.slf4j.Slf4j; -import org.aspectj.lang.ProceedingJoinPoint; -import org.aspectj.lang.annotation.Around; -import org.aspectj.lang.annotation.Aspect; -import org.aspectj.lang.annotation.Pointcut; -import org.springframework.stereotype.Component; -import org.springframework.web.context.request.RequestContextHolder; -import org.springframework.web.context.request.ServletRequestAttributes; - -import java.util.Enumeration; -import java.util.HashMap; -import java.util.Map; - -@Aspect -@Component -@Slf4j -public class LoggingAspect { - - @Pointcut("execution(* com.asap.server.presentation.controller..*(..)) || ( execution(* com.asap.server.presentation.common.advice..*(..)) && !execution(* com.asap.server.presentation.common.advice.ControllerExceptionAdvice.handleException*(..)))") - public void controllerInfoLevelExecute() { - } - - @Pointcut("execution(* com.asap.server.presentation.common.advice.ControllerExceptionAdvice.handleException*(..))") - public void controllerErrorLevelExecute() { - } - - @Around("com.asap.server.presentation.config.aspect.LoggingAspect.controllerInfoLevelExecute()") - public Object requestInfoLevelLogging(ProceedingJoinPoint proceedingJoinPoint) throws Throwable { - HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest(); - long startAt = System.currentTimeMillis(); - Object returnValue = proceedingJoinPoint.proceed(proceedingJoinPoint.getArgs()); - long endAt = System.currentTimeMillis(); - - log.info("================================================NEW==============================================="); - log.info("====> Request: {} {} ({}ms)\n *Header = {}", request.getMethod(), request.getRequestURL(), endAt - startAt, getHeaders(request)); - if ("POST".equalsIgnoreCase(request.getMethod())) { - log.info("====> Body: {}", ((CustomHttpServletRequestWrapper) request).getBody()); - } - if (returnValue != null) { - log.info("====> Response: {}", returnValue); - } - log.info("================================================END==============================================="); - return returnValue; - } - - @Around("com.asap.server.presentation.config.aspect.LoggingAspect.controllerErrorLevelExecute()") - public Object requestErrorLevelLogging(ProceedingJoinPoint proceedingJoinPoint) throws Throwable { - HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest(); - long startAt = System.currentTimeMillis(); - Object returnValue = proceedingJoinPoint.proceed(proceedingJoinPoint.getArgs()); - long endAt = System.currentTimeMillis(); - - log.error("====> Request: {} {} ({}ms)\n *Header = {}", request.getMethod(), request.getRequestURL(), endAt - startAt, getHeaders(request)); - if ("POST".equalsIgnoreCase(request.getMethod())) { - log.error("====> Body: {}", ((CustomHttpServletRequestWrapper) request).getBody()); - } - if (returnValue != null) { - log.error("====> Response: {}", returnValue); - } - log.error("================================================END==============================================="); - return returnValue; - } - - private Map getHeaders(HttpServletRequest request) { - Map headerMap = new HashMap<>(); - - Enumeration headerArray = request.getHeaderNames(); - while (headerArray.hasMoreElements()) { - String headerName = headerArray.nextElement(); - headerMap.put(headerName, request.getHeader(headerName)); - } - return headerMap; - } -} diff --git a/src/main/java/com/asap/server/presentation/common/wrapper/CustomHttpServletRequestWrapper.java b/src/main/java/com/asap/server/presentation/config/duplicate/CustomHttpServletRequestWrapper.java similarity index 96% rename from src/main/java/com/asap/server/presentation/common/wrapper/CustomHttpServletRequestWrapper.java rename to src/main/java/com/asap/server/presentation/config/duplicate/CustomHttpServletRequestWrapper.java index 3eb4765..051d59a 100644 --- a/src/main/java/com/asap/server/presentation/common/wrapper/CustomHttpServletRequestWrapper.java +++ b/src/main/java/com/asap/server/presentation/config/duplicate/CustomHttpServletRequestWrapper.java @@ -1,16 +1,15 @@ -package com.asap.server.presentation.common.wrapper; +package com.asap.server.presentation.config.duplicate; import jakarta.servlet.ReadListener; import jakarta.servlet.ServletInputStream; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequestWrapper; -import lombok.Getter; - import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; +import lombok.Getter; @Getter public class CustomHttpServletRequestWrapper extends HttpServletRequestWrapper { diff --git a/src/main/java/com/asap/server/presentation/config/filter/CustomServletWrappingFilter.java b/src/main/java/com/asap/server/presentation/config/duplicate/CustomServletWrappingFilter.java similarity index 67% rename from src/main/java/com/asap/server/presentation/config/filter/CustomServletWrappingFilter.java rename to src/main/java/com/asap/server/presentation/config/duplicate/CustomServletWrappingFilter.java index f2ecb3c..64bd2d6 100644 --- a/src/main/java/com/asap/server/presentation/config/filter/CustomServletWrappingFilter.java +++ b/src/main/java/com/asap/server/presentation/config/duplicate/CustomServletWrappingFilter.java @@ -1,19 +1,22 @@ -package com.asap.server.presentation.config.filter; +package com.asap.server.presentation.config.duplicate; -import com.asap.server.presentation.common.wrapper.CustomHttpServletRequestWrapper; import jakarta.servlet.Filter; import jakarta.servlet.FilterChain; import jakarta.servlet.ServletException; import jakarta.servlet.ServletRequest; import jakarta.servlet.ServletResponse; import jakarta.servlet.http.HttpServletRequest; - import java.io.IOException; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; +@Order(2) +@Component public class CustomServletWrappingFilter implements Filter { @Override - public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) + throws IOException, ServletException { HttpServletRequest request = new CustomHttpServletRequestWrapper((HttpServletRequest) servletRequest); filterChain.doFilter(request, servletResponse); } diff --git a/src/main/java/com/asap/server/presentation/config/interceptor/DuplicatedInterceptor.java b/src/main/java/com/asap/server/presentation/config/duplicate/DuplicatedInterceptor.java similarity index 94% rename from src/main/java/com/asap/server/presentation/config/interceptor/DuplicatedInterceptor.java rename to src/main/java/com/asap/server/presentation/config/duplicate/DuplicatedInterceptor.java index b01a2e1..4f803e3 100644 --- a/src/main/java/com/asap/server/presentation/config/interceptor/DuplicatedInterceptor.java +++ b/src/main/java/com/asap/server/presentation/config/duplicate/DuplicatedInterceptor.java @@ -1,7 +1,6 @@ -package com.asap.server.presentation.config.interceptor; +package com.asap.server.presentation.config.duplicate; -import com.asap.server.presentation.common.wrapper.CustomHttpServletRequestWrapper; import com.asap.server.common.exception.Error; import com.asap.server.common.exception.model.TooManyRequestException; import jakarta.servlet.http.HttpServletRequest; diff --git a/src/main/java/com/asap/server/presentation/config/filter/HttpRequestConfig.java b/src/main/java/com/asap/server/presentation/config/filter/HttpRequestConfig.java deleted file mode 100644 index 453babe..0000000 --- a/src/main/java/com/asap/server/presentation/config/filter/HttpRequestConfig.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.asap.server.presentation.config.filter; - -import org.springframework.boot.web.servlet.FilterRegistrationBean; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import java.util.Arrays; - -@Configuration -public class HttpRequestConfig { - @Bean - public FilterRegistrationBean reReadableRequestFilter() { - FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new CustomServletWrappingFilter()); - - filterRegistrationBean.setUrlPatterns(Arrays.asList("/*")); - return filterRegistrationBean; - } -} From a32331ac0e0fb43e44c33780177f03613569cf93 Mon Sep 17 00:00:00 2001 From: KWY Date: Sat, 18 Jan 2025 20:48:04 +0900 Subject: [PATCH 5/8] =?UTF-8?q?#338=20[chore]=20p6spy=20=EC=9D=98=EC=A1=B4?= =?UTF-8?q?=EC=84=B1=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 3 +++ 1 file changed, 3 insertions(+) diff --git a/build.gradle b/build.gradle index 815329e..269283e 100644 --- a/build.gradle +++ b/build.gradle @@ -38,6 +38,9 @@ repositories { dependencies { implementation "org.redisson:redisson:3.29.0" + // p6spy + implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.10.0' + // QueryDSL Implementation implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta' annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta" From 8bc3bce457b51152f005736182ad3e7ed5da05ba Mon Sep 17 00:00:00 2001 From: KWY Date: Sat, 18 Jan 2025 21:33:15 +0900 Subject: [PATCH 6/8] =?UTF-8?q?#338=20[del]=20=EA=B8=B0=EC=A1=B4=20file=20?= =?UTF-8?q?appender=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/file-error-appender.xml | 14 -------------- src/main/resources/file-info-appender.xml | 14 -------------- 2 files changed, 28 deletions(-) delete mode 100644 src/main/resources/file-error-appender.xml delete mode 100644 src/main/resources/file-info-appender.xml diff --git a/src/main/resources/file-error-appender.xml b/src/main/resources/file-error-appender.xml deleted file mode 100644 index 29a9a88..0000000 --- a/src/main/resources/file-error-appender.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - /logs/error/error-${BY_DATE}.log - true - - ERROR - ACCEPT - DENY - - - ${LOG_PATTERN} - - - \ No newline at end of file diff --git a/src/main/resources/file-info-appender.xml b/src/main/resources/file-info-appender.xml deleted file mode 100644 index 713e125..0000000 --- a/src/main/resources/file-info-appender.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - /logs/info/info-${BY_DATE}.log - true - - INFO - ACCEPT - DENY - - - ${LOG_PATTERN} - - - \ No newline at end of file From edd69adacf1af91eb758abc809e0bc0dfb40413f Mon Sep 17 00:00:00 2001 From: KWY Date: Sat, 18 Jan 2025 21:33:31 +0900 Subject: [PATCH 7/8] =?UTF-8?q?#338=20[feat]=20rolling=20file=20appender?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/logback-spring.xml | 6 ++---- src/main/resources/prod-rolling-file-appender.xml | 11 +++++++++++ 2 files changed, 13 insertions(+), 4 deletions(-) create mode 100644 src/main/resources/prod-rolling-file-appender.xml diff --git a/src/main/resources/logback-spring.xml b/src/main/resources/logback-spring.xml index 878cfaf..1b2bef7 100644 --- a/src/main/resources/logback-spring.xml +++ b/src/main/resources/logback-spring.xml @@ -11,12 +11,10 @@ - - + - - + diff --git a/src/main/resources/prod-rolling-file-appender.xml b/src/main/resources/prod-rolling-file-appender.xml new file mode 100644 index 0000000..acb8aff --- /dev/null +++ b/src/main/resources/prod-rolling-file-appender.xml @@ -0,0 +1,11 @@ + + + + /logs/info-%d{yyyy-MM-dd}.log + 30 + + + ${LOG_PATTERN} + + + \ No newline at end of file From 617c66da1efee54292f0ab44bb94b6937d01564e Mon Sep 17 00:00:00 2001 From: KWY Date: Sun, 19 Jan 2025 16:13:30 +0900 Subject: [PATCH 8/8] =?UTF-8?q?#338=20[feat]=20=ED=83=80=20=EC=8A=A4?= =?UTF-8?q?=EB=A0=88=EB=93=9C=EC=97=90=20mdc=20=EB=AC=B8=EB=A7=A5=20?= =?UTF-8?q?=EC=A0=84=ED=8C=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/log/MDCContextTaskDecorator.java | 26 +++++++++++++++++++ .../config/async/AsyncConfig.java | 4 ++- 2 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/asap/server/presentation/common/log/MDCContextTaskDecorator.java diff --git a/src/main/java/com/asap/server/presentation/common/log/MDCContextTaskDecorator.java b/src/main/java/com/asap/server/presentation/common/log/MDCContextTaskDecorator.java new file mode 100644 index 0000000..bac79d1 --- /dev/null +++ b/src/main/java/com/asap/server/presentation/common/log/MDCContextTaskDecorator.java @@ -0,0 +1,26 @@ +package com.asap.server.presentation.common.log; + +import java.util.Map; +import org.slf4j.MDC; +import org.springframework.core.task.TaskDecorator; +import org.springframework.stereotype.Component; + +@Component +public class MDCContextTaskDecorator implements TaskDecorator { + @Override + public Runnable decorate(Runnable runnable) { + final Map mdc = MDC.getCopyOfContextMap(); + return () -> { + try { + if (mdc != null) { + MDC.setContextMap(mdc); + } + runnable.run(); + } finally { + if (mdc != null) { + mdc.clear(); + } + } + }; + } +} diff --git a/src/main/java/com/asap/server/presentation/config/async/AsyncConfig.java b/src/main/java/com/asap/server/presentation/config/async/AsyncConfig.java index 63ae4c1..40e917e 100644 --- a/src/main/java/com/asap/server/presentation/config/async/AsyncConfig.java +++ b/src/main/java/com/asap/server/presentation/config/async/AsyncConfig.java @@ -3,6 +3,7 @@ import java.util.concurrent.Executor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.core.task.TaskDecorator; import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; @@ -10,11 +11,12 @@ @EnableAsync public class AsyncConfig { @Bean - public Executor threadPoolTaskExecutor() { + public Executor threadPoolTaskExecutor(TaskDecorator taskDecorator) { ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor(); taskExecutor.setCorePoolSize(1); taskExecutor.setQueueCapacity(10); taskExecutor.setMaxPoolSize(3); + taskExecutor.setTaskDecorator(taskDecorator); return taskExecutor; } }