写点什么

如何在 Spring Boot 中开发一个操作日志系统

作者:Swift社区
  • 2024-07-01
    上海
  • 本文字数:2349 字

    阅读完需:约 8 分钟

前言

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

添加依赖

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


<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 脚本:


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);
复制代码

创建实体类

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


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}
复制代码

创建仓库接口

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


import org.springframework.data.jpa.repository.JpaRepository;
public interface OperationLogRepository extends JpaRepository<OperationLog, Long> {}
复制代码

创建 AOP 切面

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


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@Componentpublic 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中配置日志级别:


logging.level.root=INFOlogging.level.com.example.yourpackage=DEBUG
复制代码

测试日志系统

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


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

用户头像

Swift社区

关注

我们希望更多的人学习和使用Swift 2020-12-29 加入

展菲,公众号 “Swift社区” 负责人,8人创作团队 9 年移动端项目研发经验,目前在上市外企从事 IT 项目管理和研发工作。全网粉丝10万+,总访问量已达数百万 《ESP32-C3 物联网工程开发实战》作者 鸿蒙讲师 技术 KOL

评论

发布
暂无评论
如何在 Spring Boot 中开发一个操作日志系统_Java’_Swift社区_InfoQ写作社区