Create you own decreator!
Add dependency:
<dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.5</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.30</version> </dependency>
aspect/Loggable.java:
package com.frankmoley.lil.fid.aspect; 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 Loggable { }
aspect/LoggingAspect.java:
package com.frankmoley.lil.fid.aspect; import java.util.Arrays; import java.util.Collection; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.AfterReturning; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; @Component @Aspect public class LoggingAspect { private static final Logger LOGGER = LoggerFactory.getLogger(LoggingAspect.class); @Pointcut("@annotation(Loggable)") public void executeLogging(){} @AfterReturning(value = "executeLogging()", returning = "returnValue") public void logMethodCall(JoinPoint joinPoint, Object returnValue){ StringBuilder message = new StringBuilder("Method: "); message.append(joinPoint.getSignature().getName()); Object[] args = joinPoint.getArgs(); if (null!=args && args.length>0){ message.append(" args=[ | "); Arrays.asList(args).forEach(arg->{ message.append(arg).append(" | "); }); message.append("]"); } if(returnValue instanceof Collection){ message.append(", returning: ").append(((Collection)returnValue).size()).append(" instance(s)"); }else{ message.append(", returning: ").append(returnValue.toString()); } LOGGER.info(message.toString()); } }
Using;
@Service public class GreetingService { @Value("${app.greeting}") private String greeting; public GreetingService(){ super(); } @Loggable public String getGreeting(String name){ return greeting + " " + name; } }
Around:
@Around(value = "executeLogging()") public Object logMethodCall(ProceedingJoinPoint joinPoint) throws Throwable { long startTime = System.currentTimeMillis(); Object returnValue = joinPoint.proceed(); long totalTime = System.currentTimeMillis()-startTime; StringBuilder message = new StringBuilder("Method: "); message.append(joinPoint.getSignature().getName()); message.append(" totalTime: ").append(totalTime).append("ms"); Object[] args = joinPoint.getArgs(); if (null!=args && args.length>0){ message.append(" args=[ | "); Arrays.asList(args).forEach(arg->{ message.append(arg).append(" | "); }); message.append("]"); } if(returnValue instanceof Collection){ message.append(", returning: ").append(((Collection)returnValue).size()).append(" instance(s)"); }else{ message.append(", returning: ").append(returnValue.toString()); } LOGGER.info(message.toString()); return returnValue; }