前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何在 Spring Boot 中实现操作日志系统

如何在 Spring Boot 中实现操作日志系统

原创
作者头像
Swift社区
发布2024-07-02 17:53:32
2190
发布2024-07-02 17:53:32
举报
文章被收录于专栏:Swift社区

前言

在开发企业级应用时,记录用户操作日志是非常重要的。这不仅能帮助开发者监控系统的行为,还能在出现问题时进行追踪。在这篇文章中,我们将介绍如何在Spring Boot中开发一个完整的日志系统,记录每一步操作,如登录、创建订单、删除、查询等。

添加依赖

首先,确保在你的Spring Boot项目中包含必要的依赖:

代码语言:xml
复制
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-logging</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <scope>runtime</scope>
</dependency>

配置日志存储

在数据库中创建一个表来存储日志信息。以下是一个示例表的SQL脚本:

代码语言:sql
复制
CREATE TABLE operation_logs (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50),
    operation VARCHAR(100),
    method VARCHAR(100),
    params TEXT,
    result TEXT,
    timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

创建实体类

接下来,创建一个实体类来映射日志表:

代码语言:java
复制
import javax.persistence.*;
import java.time.LocalDateTime;

@Entity
@Table(name = "operation_logs")
public class OperationLog {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    private String username;
    private String operation;
    private String method;
    
    @Lob
    private String params;
    
    @Lob
    private String result;
    
    private LocalDateTime timestamp;

    // Getters and setters
}

创建仓库接口

创建一个仓库接口来管理日志记录:

代码语言:java
复制
import org.springframework.data.jpa.repository.JpaRepository;

public interface OperationLogRepository extends JpaRepository<OperationLog, Long> {
}

创建AOP切面

使用Spring AOP来拦截方法并记录日志:

代码语言:java
复制
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import java.time.LocalDateTime;
import java.util.Arrays;

@Aspect
@Component
public class LoggingAspect {

    @Autowired
    private OperationLogRepository logRepository;

    @Autowired
    private HttpServletRequest request;

    @Before("execution(* com.example.yourpackage..*(..))")
    public void logBefore(JoinPoint joinPoint) {
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        String methodName = signature.getMethod().getName();
        String className = joinPoint.getTarget().getClass().getName();
        String operation = "Executing method: " + className + "." + methodName;
        
        String username = request.getUserPrincipal().getName(); // 获取当前用户名
        String params = Arrays.toString(joinPoint.getArgs());

        OperationLog log = new OperationLog();
        log.setUsername(username);
        log.setOperation(operation);
        log.setMethod(className + "." + methodName);
        log.setParams(params);
        log.setTimestamp(LocalDateTime.now());
        
        logRepository.save(log);
    }

    @AfterReturning(pointcut = "execution(* com.example.yourpackage..*(..))", returning = "result")
    public void logAfter(JoinPoint joinPoint, Object result) {
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        String methodName = signature.getMethod().getName();
        String className = joinPoint.getTarget().getClass().getName();
        String operation = "Completed method: " + className + "." + methodName;

        String username = request.getUserPrincipal().getName(); // 获取当前用户名
        String params = Arrays.toString(joinPoint.getArgs());
        
        OperationLog log = new OperationLog();
        log.setUsername(username);
        log.setOperation(operation);
        log.setMethod(className + "." + methodName);
        log.setParams(params);
        log.setResult(result != null ? result.toString() : "null");
        log.setTimestamp(LocalDateTime.now());
        
        logRepository.save(log);
    }
}

配置日志级别

application.propertiesapplication.yml中配置日志级别:

代码语言:properties
复制
logging.level.root=INFO
logging.level.com.example.yourpackage=DEBUG

测试日志系统

编写单元测试或通过实际操作测试日志系统是否按预期工作。

通过上述步骤,您可以在Spring Boot项目中实现一个功能完善的日志系统,记录用户的每一步操作,包括登录、创建订单、删除、查询等。这个日志系统将帮助您更好地监控和维护应用程序,同时提供有价值的审计追踪。

我正在参与2024腾讯技术创作特训营最新征文,快来和我瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 添加依赖
  • 配置日志存储
  • 创建实体类
  • 创建仓库接口
  • 创建AOP切面
  • 配置日志级别
  • 测试日志系统
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档