Skip to content
shubhamphepale edited this page Oct 28, 2021 · 3 revisions

Description

The Simple Logging Facade for Java (SLF4J) serves as a simple facade or abstraction for various logging frameworks. It allows you to code while depending on just one dependency, namely "slf4j-api.jar", and to plug in the desired logging framework at runtime. It is very simple to use slf4 logging in your application. You just need to create a slf4j logger and invoke its methods. The LoggerFactory is a utility class producing Loggers for various logging APIs, most notably for log4j, logback. LoggerFactory is essentially a wrapper around an ILoggerFactory instance bound with LoggerFactory at compile time.

Packages

  1. slf4j.Logger — It provides a simple abstraction of all the logging frameworks.
  2. slf4j.loggerfactory — LoggerFactory is a utility class producing Loggers for various logging APIs.
  3. org.aspectj.lang.annotation.Pointcut — AspectJ provides primitive pointcuts that capture join points at these times.

Code Snippet

Pointcut that matches all Spring beans, repositories, services and Web REST endpoints.

@Pointcut(
    "within(@org.springframework.stereotype.Repository *)" +
    " || within(@org.springframework.stereotype.Service *)" +
    " || within(@org.springframework.web.bind.annotation.RestController *)"
)

@Pointcut(
    "within(com.springboot.rest.repository..*)" +
    " || within(com.springboot.rest.service..*)" +
    " || within(com.springboot.rest.web.rest..*)"
)

Retrieves the Logger associated to the given JoinPoint. @param joinPoint join point we want the logger for. return Logger associated to the given JoinPoint.

  private Logger logger(JoinPoint joinPoint) {
      return LoggerFactory.getLogger(joinPoint.getSignature().getDeclaringTypeName());
  }

logs methods throwing exceptions.

 @AfterThrowing(pointcut = "applicationPackagePointcut() && springBeanPointcut()", throwing = "e")
 public void logAfterThrowing(JoinPoint joinPoint, Throwable e) {
     if (env.acceptsProfiles(Profiles.of(JHipsterConstants.SPRING_PROFILE_DEVELOPMENT))) {
         logger(joinPoint)
             .error(
                 "Exception in {}() with cause = \'{}\' and exception = \'{}\'",
                 joinPoint.getSignature().getName(),
                 e.getCause() != null ? e.getCause() : "NULL",
                 e.getMessage(),
                 e
             );
     } else {
         logger(joinPoint)
             .error(
                 "Exception in {}() with cause = {}",
                 joinPoint.getSignature().getName(),
                 e.getCause() != null ? e.getCause() : "NULL"
            );
     }
 }

logs when a method is entered and exited

@Around("applicationPackagePointcut() && springBeanPointcut()")
public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {
    Logger log = logger(joinPoint);
    if (log.isDebugEnabled()) {
        log.debug("Enter: {}() with argument[s] = {}", joinPoint.getSignature().getName(), Arrays.toString(joinPoint.getArgs()));
    }
    try {
        Object result = joinPoint.proceed();
        if (log.isDebugEnabled()) {
            log.debug("Exit: {}() with result = {}", joinPoint.getSignature().getName(), result);
        }
        return result;
    } catch (IllegalArgumentException e) {
        log.error("Illegal argument: {} in {}()", Arrays.toString(joinPoint.getArgs()), joinPoint.getSignature().getName());
        throw e;
    }
}

Create a class named LoggingAspect at location com.springboot.rest.aop.logging

 public class LoggingAspect {
   private final Environment env;
   public LoggingAspect(Environment env) {
       this.env = env;
   }
   @Pointcut(
       "within(@org.springframework.stereotype.Repository *)" +
       " || within(@org.springframework.stereotype.Service *)" +
       " || within(@org.springframework.web.bind.annotation.RestController *)"
   )
   public void springBeanPointcut() {
   }
   @Pointcut(
       "within(com.springboot.rest.repository..*)" +
       " || within(com.springboot.rest.service..*)" +
       " || within(com.springboot.rest.web.rest..*)"
   )
   public void applicationPackagePointcut() {
   }
   private Logger logger(JoinPoint joinPoint) {
       return LoggerFactory.getLogger(joinPoint.getSignature().getDeclaringTypeName());
   }
   @AfterThrowing(pointcut = "applicationPackagePointcut() && springBeanPointcut()", throwing = "e")
   public void logAfterThrowing(JoinPoint joinPoint, Throwable e) {
      if (env.acceptsProfiles(Profiles.of(JHipsterConstants.SPRING_PROFILE_DEVELOPMENT))) {
          logger(joinPoint)
              .error(
                  "Exception in {}() with cause = \'{}\' and exception = \'{}\'",
                  joinPoint.getSignature().getName(),
                  e.getCause() != null ? e.getCause() : "NULL",
                  e.getMessage(),
                  e
              );
       } else {
          logger(joinPoint)
              .error(
                  "Exception in {}() with cause = {}",
                  joinPoint.getSignature().getName(),
                  e.getCause() != null ? e.getCause() : "NULL"
              );
       }
   }
   @Around("applicationPackagePointcut() && springBeanPointcut()")
   public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {
      Logger log = logger(joinPoint);
      if (log.isDebugEnabled()) {
          log.debug("Enter: {}() with argument[s] = {}", joinPoint.getSignature().getName(), Arrays.toString(joinPoint.getArgs()));
      }
      try {
          Object result = joinPoint.proceed();
          if (log.isDebugEnabled()) {
              log.debug("Exit: {}() with result = {}", joinPoint.getSignature().getName(), result);
          }
          return result;
      } catch (IllegalArgumentException e) {
          log.error("Illegal argument: {} in {}()", Arrays.toString(joinPoint.getArgs()), joinPoint.getSignature().getName());
          throw e;
      }
   }
 }

Clone this wiki locally