当前位置: 首页 > 知识库问答 >
问题:

Spring AOP日志和缓存

西门威
2023-03-14

我通过一个简单的方面记录方法的输入和输出参数。

package com.mk.cache;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import java.util.Arrays;

@Aspect
@Component
public class LoggingAspect {
    @Around("within(@com.mk.cache.LoggedIO *) && execution(* *(..))")
    public Object logAroundPublicMethod(ProceedingJoinPoint joinPoint) throws Throwable {
        String wrappedClassName = joinPoint.getSignature().getDeclaringTypeName();
        Logger LOGGER = LoggerFactory.getLogger(wrappedClassName);
        String methodName = joinPoint.getSignature().getName();
    LOGGER.info("LOG by AOP - invoking {}({})", methodName, Arrays.toString(joinPoint.getArgs()));
    Object result = joinPoint.proceed();
    LOGGER.info("LOG by AOP - result of {}={}", methodName, result);
        return result;
    }
}
package com.mk.cache;

public @interface LoggedIO {

}
package com.mk.cache;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

@Service
@LoggedIO
public class CachedService {

    private static final Logger LOGGER = LoggerFactory.getLogger(CachedService.class);

    @Cacheable("myCacheGet")
    public int getInt(int input) {
        LOGGER.info("Doing real work");
        return input;
    }
}
package com.mk.cache;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;

@SpringBootApplication
@EnableCaching
public class CacheApplication implements CommandLineRunner {

    private static final Logger LOGGER = LoggerFactory.getLogger(CacheApplication.class);

    public static void main(String[] args) {
        SpringApplication.run(CacheApplication.class, args);
    }

    @Autowired
    private CachedService cachedService;

    @Override
    public void run(String... args) throws Exception {
        LOGGER.info("cachedService.getInt(1)={}", cachedService.getInt(1));
        LOGGER.info("cachedService.getInt(1)={}", cachedService.getInt(1));
    }
}
LOG by AOP - invoking getInt([1])
Doing real work
LOG by AOP - result of getInt=1
cachedService.getInt(1)=1
cachedService.getInt(1)=1

我的问题是,当我第二次调用logger.info(“cachedService.getInt(1)={}”,cachedService.getInt(1));时,将使用缓存的值,但没有记录输入和输出参数,因为缓存是第一个包装器。是否可以将LoggingAspect配置为第一个包装器,这样我就可以同时使用AOP日志和Spring缓存了?

共有1个答案

漆雕嘉平
2023-03-14

只需实现spring Ordered接口,并在getOrder()方法中返回1。

@Aspect
@Component
public class LoggingAspect implements Ordered {
    @Around("within(@com.mk.cache.LoggedIO *) && execution(* *(..))")
    public Object logAroundPublicMethod(ProceedingJoinPoint joinPoint) throws Throwable {
        String wrappedClassName = joinPoint.getSignature().getDeclaringTypeName();
        Logger LOGGER = LoggerFactory.getLogger(wrappedClassName);
        String methodName = joinPoint.getSignature().getName();
    LOGGER.info("LOG by AOP - invoking {}({})", methodName, Arrays.toString(joinPoint.getArgs()));
    Object result = joinPoint.proceed();
    LOGGER.info("LOG by AOP - result of {}={}", methodName, result);
        return result;
    }

    @Override
    public int getOrder() {
        return 1;
    }

}

在这里阅读更多。第11.2.7章

 类似资料:
  • 无法将应用程序推送到IBM云,原因是错误404表示暂存应用程序和跟踪日志...从日志缓存检索日志失败:意外状态代码404

  • 本章展示如何配置Istio来自动收集mesh中服务的遥测数据。 在本章末尾,将为mesh中的服务调用启用新的metric和新的日志流。 BookInfo应用将作为介绍本章内容的示例应用。 开始之前 在集群中安装Istio并部署一个应用程序。 本章假设Mixer使用默认配置(--configDefaultNamespace=istio-system)。 如果使用不同的值,则更新这个任务中的配置和命令

  • 我刚拿到一台新的索尼Xperia XA,在这台设备上发现了一个奇怪的问题。它没有显示任何详细的调试日志。我尝试了Android Studio中的每个设置,使用adb logcat检查Android Studio是否只是过滤它们。我甚至使用了不同的电缆。我没主意了,请帮帮我。

  • 有人能告诉我是否可以添加 谷歌不是朋友,PostSharp的留档也没有帮助。我知道在哪里可以创建自定义格式化程序或后端,但我在这些示例中看不到如何自定义方法入口和方法出口的日志条目。 实际PostSharp日志输出w/NLog 需要的PostSharp日志输出,带NLog 我正在使用以下内容: 我使用的是直接从他们的示例中提取的NLog配置: 我没有任何其他代码可以显示,因为我不知道从哪里开始编写

  • 主要内容:读者,前提条件,Spring AOP 概述Spring框架的关键组件之一是面向方面编程(AOP)框架。 面向方面的编程需要将程序逻辑分解成不同的部分。 此教程将通过简单实用的方法来学习Spring框架提供的AOP/面向方面编程。 读者 本教程主要是为Spring 面向方面编程(AOP)初学者准备的,帮助他们了解与Spring的AOP框架相关的基础到高级概念。 前提条件 在开始练习本教程系列文章中给出的各种类型的示例之前,我们假设您已经了解

  • 本文向大家介绍Mysql日志文件和日志类型介绍,包括了Mysql日志文件和日志类型介绍的使用技巧和注意事项,需要的朋友参考一下 日志文件类型 MySQL有几个不同的日志文件,可以帮助你找出mysqld内部发生的事情: 日志文件 记入文件中的信息类型 错误日志 记录启动、运行或停止mysqld时出现的问题。 查询日志 记录建立的客户端连接和执行的语句。 更新日志 记录更改数据的语句。不赞成使用该日志