diff --git a/module-api/src/main/java/com/kernel360/aop/LogAspect.java b/module-api/src/main/java/com/kernel360/aop/LogAspect.java deleted file mode 100644 index 1b4f05bb..00000000 --- a/module-api/src/main/java/com/kernel360/aop/LogAspect.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.kernel360.aop; - -import lombok.extern.slf4j.Slf4j; -import org.aspectj.lang.JoinPoint; -import org.aspectj.lang.annotation.*; -import org.springframework.stereotype.Component; - -import java.util.Arrays; - -@Slf4j -@Aspect -@Component -public class LogAspect { - - @Pointcut("within(*..*Controller)") - public void allController() {} - - @Before("allController()") - public void beforeRequest(JoinPoint joinPoint) { - log.info("###Start request {}", joinPoint.getSignature().toShortString()); - - Arrays.stream(joinPoint.getArgs()) - .map(arg -> arg != null ? "\t" + arg : "\tnull") - .forEach(log::info); - } - - @AfterReturning(pointcut = "allController()", returning = "returnValue") - public void afterReturningLogging(JoinPoint joinPoint, Object returnValue) { - log.info("###End request {}", joinPoint.getSignature().toShortString()); - - if (returnValue == null) return; - - log.info("###returnValue -> {}", returnValue); - } - - @AfterThrowing(pointcut = "allController()", throwing = "e") - public void afterThrowingLogging(JoinPoint joinPoint, Exception e) { - log.error("###Occured error in request {}", joinPoint.getSignature().toShortString()); - log.error("###e.getMessage() -> {}", e.getMessage()); - } -} \ No newline at end of file diff --git a/module-api/src/main/java/com/kernel360/global/annotation/LogExecutionTime.java b/module-api/src/main/java/com/kernel360/global/annotation/LogExecutionTime.java new file mode 100644 index 00000000..4086c6de --- /dev/null +++ b/module-api/src/main/java/com/kernel360/global/annotation/LogExecutionTime.java @@ -0,0 +1,11 @@ +package com.kernel360.global.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +public @interface LogExecutionTime { +} diff --git a/module-api/src/main/java/com/kernel360/global/aop/LogAspect.java b/module-api/src/main/java/com/kernel360/global/aop/LogAspect.java new file mode 100644 index 00000000..037e8951 --- /dev/null +++ b/module-api/src/main/java/com/kernel360/global/aop/LogAspect.java @@ -0,0 +1,24 @@ +package com.kernel360.global.aop; + +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.springframework.stereotype.Component; + +@Slf4j +@Aspect +@Component +public class LogAspect { + + @Around("@annotation(com.kernel360.global.annotation.LogExecutionTime)") + public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable { + long start = System.currentTimeMillis(); + Object proceed = joinPoint.proceed(); + + long executionTime = System.currentTimeMillis() - start; + log.info("##### @LogExecutionTime ##### " + joinPoint.getSignature() + " executed in " + executionTime + "ms"); + + return proceed; + } +} \ No newline at end of file diff --git a/module-api/src/main/java/com/kernel360/global/filter/LogFilter.java b/module-api/src/main/java/com/kernel360/global/filter/LogFilter.java new file mode 100644 index 00000000..dfea3ef2 --- /dev/null +++ b/module-api/src/main/java/com/kernel360/global/filter/LogFilter.java @@ -0,0 +1,61 @@ +package com.kernel360.global.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; + +@Slf4j +@Component +public class LogFilter implements Filter { + + @Override + public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { + ContentCachingRequestWrapper request = new ContentCachingRequestWrapper((HttpServletRequest) req); + ContentCachingResponseWrapper response = new ContentCachingResponseWrapper((HttpServletResponse) res); + log.info("##### INIT URI: {}", request.getRequestURI()); + + chain.doFilter(request, response); + + // Request + StringBuilder requestHeaderValues = new StringBuilder(); + request.getHeaderNames().asIterator().forEachRemaining(headerKey -> { + String headerValue = request.getHeader(headerKey); + + requestHeaderValues + .append("[") + .append(headerKey) + .append(" : ") + .append(headerValue) + .append("] "); + }); + + String requestBody = new String(request.getContentAsByteArray()); + String uri = request.getRequestURI(); + String method = request.getMethod(); + log.info("##### REQUEST ##### uri: {}, method: {}, header: {}, body: {}", uri, method, requestHeaderValues, requestBody); + + // Response + StringBuilder responseHeaderValues = new StringBuilder(); + response.getHeaderNames().forEach(headerKey -> { + String headerValue = response.getHeader(headerKey); + + responseHeaderValues + .append("[") + .append(headerKey) + .append(" : ") + .append(headerValue) + .append("] "); + }); + + String responseBody = new String(response.getContentAsByteArray()); + log.info("##### RESPONSE ##### uri: {}, method: {}, header: {}, body: {}", uri, method, responseHeaderValues, responseBody); + + response.copyBodyToResponse(); + } +}