在 AOP 记录器中定义 class 名称

Define class name in AOP Logger

你能告诉我是否可以通过在控制台包中定义的 Spring Boot AOP Logger 和实际代理的 class 名称吗?

为了更好地理解这里是我的控制台的屏幕截图:

如您所见,我的记录器有包和 class 名称,但我的目标是 c.s.b.c.MyAspectOrientedLogger 例如这个 c.s.b.s.UserService

还有我的记录器:

@Aspect
@Component
@EnableAspectJAutoProxy(proxyTargetClass = true)
public class MyAspectOrientedLogger {

    private Logger lgr = LoggerFactory.getLogger(this.getClass());

    @Around("...")
    public Object logFunctions(ProceedingJoinPoint joinPoint) throws Throwable {

        Object proceed = joinPoint.proceed();
        LOGGER.debug("My some logging output ...");
        return proceed;
    }

我知道我可以使用 joinPoint.getTarget().getClass() 并打印该名称,但我想要它而不是记录器 class。可能吗?谢谢

是的,这是可能的。 joinPoint 参数提供了一个名为 getSignature 的方法,它再次提供了方法 getDeclaringType,其中 returns 方法 class 的 class 对象,其中纵横交错。

你可以这样使用它:

    Class type = joinPoint.getSignature().getDeclaringType();

    Logger lgr = LoggerFactory.getLogger(type);

    Object proceed = joinPoint.proceed();
    lgr.error("My some logging output ...");

然而,这样做的结果是,您无法静态获取记录器,您必须从方面本身的工厂中获取实例。我不确定这样的解决方案的性能缺陷,如果您编写重负载应用程序,则必须对其进行测试。