Можно ли «подражать» классу в журнале через аспект? - PullRequest
0 голосов
/ 20 марта 2020

Я разработал аспект, который будет регистрировать при входе и выходе из класса со стандартным форматом, который также регистрирует класс, поэтому что-то вроде:

2020-03-20 20:05:30.280  INFO 3336 --- [nio-8080-exec-2] c.a.common.aop.LoggingAspect        : Entering method

Обратите внимание, что класс ведения журнала выглядит как "LoggingAspect". Можно ли вместо этого записать имя прокси-класса? На данный момент я получаю:

2020-03-20 20:05:30.280  INFO 3336 --- [nio-8080-exec-2] c.a.common.aop.LoggingAspect        : Entering method 
2020-03-20 20:06:30.280  INFO 3336 --- [nio-8080-exec-2] c.a.my.proxied.Class        : Doing stuff
2020-03-20 20:05:30.280  INFO 3336 --- [nio-8080-exec-2] c.a.common.aop.LoggingAspect        : Exiting method 

Я хотел бы всегда иметь c.a.my.proxied.Class для каждой строки. Вот мой аспект:

@Aspect
@Order(1)
@Component
@Slf4j
public class LoggingAspect {

  @Pointcut("@within(org.springframework.web.bind.annotation.RestController)")
  private void controllerInvocation() {}

  @Around("controllerInvocation()")
  public Object logEntering(ProceedingJoinPoint joinPoint) throws Throwable{
     log.info("Entering method");
     Object res = joinPoint.proceed();
     log.info("Exiting method");
     return res;
  }
}

1 Ответ

1 голос
/ 21 марта 2020

Из документации для аннотации @Slf4j

@Slf4j
public class LogExample {}

сгенерирует:

public class LogExample {
    private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LogExample.class);
}

, что означает, что при использовании ссылки log он всегда будет для LoggingAspect в общем коде.

Обходной путь может быть следующим:

import org.slf4j.Logger;
import static org.slf4j.LoggerFactory.getLogger;

// ...

@Around("controllerInvocation()")
public Object logEntering(ProceedingJoinPoint joinPoint) throws Throwable {
    // Get the logger for the class of intercepted method
    Logger logz = getLogger(joinPoint.getTarget().getClass());
    logz.info("Entering method");
    Object res = joinPoint.proceed();
    logz.info("Exiting method");
    return res;
}

Надеюсь, это поможет


Редактировать: OP требуемый @ kriegaex для примера его предложения. Я позволю себе проиллюстрировать его предложения.

Пожалуйста, обратитесь к примеру раздел в документации для получения более подробной информации

import org.slf4j.Logger;
import static org.slf4j.LoggerFactory.getLogger;

// ...

@Around("controllerInvocation() && target(myTarget)")
public Object logEntering(ProceedingJoinPoint joinPoint,Object myTarget) throws Throwable {
    // Get the logger for the class of intercepted method
    Logger logz = getLogger(myTarget.getClass());
    logz.info("Entering method");
    try{
        Object res = joinPoint.proceed();
    }finally{
        logz.info("Exiting method");
    }
    return res;
}
...