使用 AOP 记录操作日志

简介: 使用 AOP 记录操作日志

AOP(Aspect-Oriented Programming,面向切面编程)是一种编程范式,它可以将横切关注点(cross-cutting concerns)与核心业务逻辑分离开来,提高了代码的模块化和可维护性。在 Spring Boot 中,AOP 可以用于记录操作日志、权限控制、性能监控等方面。

 

下面我们来看一个使用 AOP 记录操作日志的案例。假设我们有一个简单的用户管理系统,其中包含用户的增删改查操作。我们希望在每次对用户进行操作时,都能记录下操作日志。

 

首先,我们需要创建一个用于记录日志的切面类,这个切面类需要实现日志记录的逻辑。接着,我们使用 AOP 的方式将这个切面类应用到用户管理的方法上。

 

```java
@Aspect
@Component
public class LogAspect {
 
    private final Logger logger = LoggerFactory.getLogger(this.getClass());
 
    @Pointcut("execution(* com.example.demo.service.UserService.*(..))")
    public void pointcut() {}
 
    @Before("pointcut()")
    public void before(JoinPoint joinPoint) {
        String methodName = joinPoint.getSignature().getName();
        Object[] args = joinPoint.getArgs();
        logger.info("Before method: {} with arguments: {}", methodName, Arrays.toString(args));
    }
 
    @AfterReturning(pointcut = "pointcut()", returning = "result")
    public void afterReturning(JoinPoint joinPoint, Object result) {
        String methodName = joinPoint.getSignature().getName();
        logger.info("After method: {} with result: {}", methodName, result);
    }
}
```

 

在这个切面类中,我们定义了两个通知(Advice):`before` 和 `afterReturning`。`before` 通知在目标方法执行前执行,用于记录方法名称和参数;`afterReturning` 通知在目标方法执行并返回结果后执行,用于记录方法名称和返回结果。

 

接着,我们需要在 Spring Boot 应用程序的主类或配置类上添加 `@EnableAspectJAutoProxy` 注解,以启用 AOP 功能。

 

```java
@SpringBootApplication
@EnableAspectJAutoProxy
public class DemoApplication {
 
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}
```

 

最后,我们可以在用户服务(`UserService`)中定义一些简单的增删改查方法,并在这些方法上应用刚刚定义的切面类。

```java
@Service
public class UserService {
 
    private List<User> users = new ArrayList<>();
 
    public List<User> getUsers() {
        return users;
    }
 
    public void addUser(User user) {
        users.add(user);
    }
 
    public void deleteUser(int userId) {
        users.removeIf(user -> user.getId() == userId);
    }
 
    public void updateUser(User user) {
        users.stream()
                .filter(u -> u.getId() == user.getId())
                .findFirst()
                .ifPresent(u -> {
                    u.setName(user.getName());
                    u.setAge(user.getAge());
                });
    }
 
    public User getUserById(int userId) {
        return users.stream()
                .filter(user -> user.getId() == userId)
                .findFirst()
                .orElse(null);
    }
}
```

 

这样,每次调用用户管理的方法时,都会触发切面类中定义的日志记录逻辑,从而实现了操作日志的记录。

 

在上面的例子中,我们使用了 `@Before` 和 `@AfterReturning` 这两种通知类型,分别在目标方法执行前和执行后执行。除了这两种通知类型外,AOP 还提供了其他几种通知类型,包括:

 

1. **@After**:在目标方法执行后(无论是否发生异常)执行。

2. **@Around**:包围目标方法执行,在方法执行前和执行后都可以添加逻辑。

3. **@AfterThrowing**:在目标方法抛出异常后执行。

 

这些通知类型可以根据实际需求选择合适的类型,并在切面类中进行相应的定义和处理。

 

另外,在实际应用中,我们还可以通过 AOP 实现更复杂的功能,如权限控制、性能监控、事务管理等。通过合理地使用 AOP,可以有效地提高代码的复用性和可维护性,提升系统的可靠性和稳定性。

相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
目录
相关文章
|
SQL 监控 Java
在IDEA 、springboot中使用切面aop实现日志信息的记录到数据库
这篇文章介绍了如何在IDEA和Spring Boot中使用AOP技术实现日志信息的记录到数据库的详细步骤和代码示例。
在IDEA 、springboot中使用切面aop实现日志信息的记录到数据库
|
SQL Java Serverless
实时计算 Flink版操作报错合集之在写入SLS(Serverless Log Service)时出现报错,该如何排查
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
Java Spring
在Spring Boot中使用AOP实现日志切面
在Spring Boot中使用AOP实现日志切面
|
存储 安全 Java
Spring Boot 3 集成Spring AOP实现系统日志记录
本文介绍了如何在Spring Boot 3中集成Spring AOP实现系统日志记录功能。通过定义`SysLog`注解和配置相应的AOP切面,可以在方法执行前后自动记录日志信息,包括操作的开始时间、结束时间、请求参数、返回结果、异常信息等,并将这些信息保存到数据库中。此外,还使用了`ThreadLocal`变量来存储每个线程独立的日志数据,确保线程安全。文中还展示了项目实战中的部分代码片段,以及基于Spring Boot 3 + Vue 3构建的快速开发框架的简介与内置功能列表。此框架结合了当前主流技术栈,提供了用户管理、权限控制、接口文档自动生成等多项实用特性。
1409 8
|
JSON Java 数据库
SpringBoot项目使用AOP及自定义注解保存操作日志
SpringBoot项目使用AOP及自定义注解保存操作日志
569 1
|
Java Serverless 应用服务中间件
函数计算操作报错合集之JVM启动时找不到指定的日志目录,该如何解决
Serverless 应用引擎(SAE)是阿里云提供的Serverless PaaS平台,支持Spring Cloud、Dubbo、HSF等主流微服务框架,简化应用的部署、运维和弹性伸缩。在使用SAE过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
498 1
|
监控 数据管理 关系型数据库
数据管理DMS使用问题之是否支持将操作日志导出至阿里云日志服务(SLS)
阿里云数据管理DMS提供了全面的数据管理、数据库运维、数据安全、数据迁移与同步等功能,助力企业高效、安全地进行数据库管理和运维工作。以下是DMS产品使用合集的详细介绍。
|
监控 Java Spring
在Spring Boot中使用AOP实现日志记录
在Spring Boot中使用AOP实现日志记录
|
监控 安全 Apache
什么是Apache日志?为什么Apache日志分析很重要?
Apache是全球广泛使用的Web服务器软件,支持超过30%的活跃网站。它通过接收和处理HTTP请求,与后端服务器通信,返回响应并记录日志,确保网页请求的快速准确处理。Apache日志分为访问日志和错误日志,对提升用户体验、保障安全及优化性能至关重要。EventLog Analyzer等工具可有效管理和分析这些日志,增强Web服务的安全性和可靠性。
831 9
|
监控 容灾 算法
阿里云 SLS 多云日志接入最佳实践:链路、成本与高可用性优化
本文探讨了如何高效、经济且可靠地将海外应用与基础设施日志统一采集至阿里云日志服务(SLS),解决全球化业务扩展中的关键挑战。重点介绍了高性能日志采集Agent(iLogtail/LoongCollector)在海外场景的应用,推荐使用LoongCollector以获得更优的稳定性和网络容错能力。同时分析了多种网络接入方案,包括公网直连、全球加速优化、阿里云内网及专线/CEN/VPN接入等,并提供了成本优化策略和多目标发送配置指导,帮助企业构建稳定、低成本、高可用的全球日志系统。
1671 55