diff --git a/src/main/java/ru/nbch/credit_tracker/config/mdc/AopMdcConfig.java b/src/main/java/ru/nbch/credit_tracker/config/mdc/AopMdcConfig.java new file mode 100644 index 0000000..1cfbbf1 --- /dev/null +++ b/src/main/java/ru/nbch/credit_tracker/config/mdc/AopMdcConfig.java @@ -0,0 +1,19 @@ +package ru.nbch.credit_tracker.config.mdc; + +import org.aspectj.lang.annotation.Aspect; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.EnableAspectJAutoProxy; + +@Configuration +@ConditionalOnClass(Aspect.class) +@EnableAspectJAutoProxy(proxyTargetClass = true) +public class AopMdcConfig { + + @Bean + public MdcAspect mdcAspect() { + return new MdcAspect(); + } + +} diff --git a/src/main/java/ru/nbch/credit_tracker/config/mdc/MdcAspect.java b/src/main/java/ru/nbch/credit_tracker/config/mdc/MdcAspect.java new file mode 100644 index 0000000..3bcbddd --- /dev/null +++ b/src/main/java/ru/nbch/credit_tracker/config/mdc/MdcAspect.java @@ -0,0 +1,49 @@ +package ru.nbch.credit_tracker.config.mdc; + +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.exception.ExceptionUtils; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.slf4j.MDC; +import ru.nbch.credit_tracker.entities.dto.UserPackage; +import ru.nbch.credit_tracker.entities.user_request.monitoring_request.MonitoringRequest; + +@Slf4j +@Aspect +public class MdcAspect { + + // For methods that set an MDC value (from a method argument) and then clear it at the end + @Around("@annotation(setAndClearMdc)") + public Object setAndClearMdcAdvice(ProceedingJoinPoint pjp, SetAndClearMdc setAndClearMdc) throws Throwable { + Object[] args = pjp.getArgs(); + int index = setAndClearMdc.argIndex(); + Object obj = (args != null && args.length > index) ? args[index] : null; + if (obj instanceof MonitoringRequest request) { + if (request.getPackageName() != null) { + putMdcValue(request.getPackageName(), setAndClearMdc.key()); + } + } else if (obj instanceof UserPackage userPackage) { + if (userPackage.getPackageName() != null) { + putMdcValue(userPackage.getPackageName(), setAndClearMdc.key()); + } + } else if (obj instanceof String packageName) { + putMdcValue(setAndClearMdc.key(), packageName); + } else { + log.debug("no packageName found for for {}", pjp.toShortString()); + } + try { + return pjp.proceed(); + } finally { + MDC.remove(setAndClearMdc.key()); + } + } + + private void putMdcValue(String value, String key) { + try { + MDC.put(key, "[" + value + "] "); + } catch (Throwable e) { + log.error("{}", ExceptionUtils.getStackTrace(e)); + } + } +} diff --git a/src/main/java/ru/nbch/credit_tracker/config/mdc/SetAndClearMdc.java b/src/main/java/ru/nbch/credit_tracker/config/mdc/SetAndClearMdc.java new file mode 100644 index 0000000..8d8a14a --- /dev/null +++ b/src/main/java/ru/nbch/credit_tracker/config/mdc/SetAndClearMdc.java @@ -0,0 +1,15 @@ +package ru.nbch.credit_tracker.config.mdc; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +// Annotation to set an MDC key based on a method argument and clear it after method execution +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.METHOD) +public @interface SetAndClearMdc { + String key() default "ru.nbch.credit_tracker.log.mdc.key"; + // The index of the method argument to use for the MDC value (defaults to the first argument) + int argIndex() default 0; +} diff --git a/src/main/java/ru/nbch/credit_tracker/service/SignalService.java b/src/main/java/ru/nbch/credit_tracker/service/SignalService.java index 138a075..aa7d910 100644 --- a/src/main/java/ru/nbch/credit_tracker/service/SignalService.java +++ b/src/main/java/ru/nbch/credit_tracker/service/SignalService.java @@ -285,7 +285,7 @@ public class SignalService { request -> { if (!request.getPersons().isEmpty()) { List subjects = request.getPersons().stream().map(p -> { - log.error("Ошибка при формировании субъекта. package_id = {}, id = {}. Описание: {}", packageId, p.getUid(), p.getValue()); + log.warn("Ошибка при формировании субъекта. package_id = {}, id = {}. Описание: {}", packageId, p.getUid(), p.getValue()); return PhoneFidMap.builder() .id(p.getUid()) .errorText(p.getValue()) diff --git a/src/main/resources/logback.xml b/src/main/resources/logback.xml index 88ce91c..ff8f347 100644 --- a/src/main/resources/logback.xml +++ b/src/main/resources/logback.xml @@ -8,7 +8,7 @@ - %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} %X{ru.nbch.credit_tracker.log.mdc.key} - %msg%n utf-8 @@ -22,7 +22,7 @@ 100MB - %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} %X{ru.nbch.credit_tracker.log.mdc.key} - %msg%n utf-8 diff --git a/src/test/java/ru/nbch/credit_tracker/utils/ValidationUtilTest.java b/src/test/java/ru/nbch/credit_tracker/utils/ValidationUtilTest.java index b8146f3..aea414b 100644 --- a/src/test/java/ru/nbch/credit_tracker/utils/ValidationUtilTest.java +++ b/src/test/java/ru/nbch/credit_tracker/utils/ValidationUtilTest.java @@ -69,12 +69,12 @@ public class ValidationUtilTest { Arguments.of( "/monitoring_request/invalid_phone_request.zip", SignalError.ERROR_003, - Collections.emptyList().toArray(new Object[0]) + new Object[]{"abc123"} ), Arguments.of( "/monitoring_request/invalid_id_request.zip", SignalError.ERROR_010, - Collections.emptyList().toArray(new Object[0]) + new Object[]{"#####"} ) ); }