首页  

springboot自定义日志注解     所属分类 springboot 浏览量 22
在 Spring Boot 中实现 自定义日志注解,可以通过 AOP(面向切面编程) 实现对方法执行的自动日志记录  
一个完整的实现方案,包含 注解定义、AOP 拦截逻辑、日志内容提取和存储方式

1. 创建自定义注解 @LogRecord
定义一个注解,用于标记需要记录日志的方法  

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

// 自定义日志注解
// 可用于方法上,记录方法执行信息(如参数、返回值、耗时等)
@Target(ElementType.METHOD)  // 作用于方法
@Retention(RetentionPolicy.RUNTIME)  // 运行时有效
public @interface LogRecord {
    String businessType() default "";  // 业务类型(如:登录、注册、删除等)
    String operator() default "";      // 操作描述(如:删除用户)
}

2. 实现 AOP 切面类

通过 @Aspect 和 @Around 拦截带有 @LogRecord 注解的方法,记录日志  

3. 日志实体类 LogRecordDO
import java.util.Date;

public class LogRecordDO {
    private String businessType;    // 业务类型
    private String operator;        // 操作描述
    private String className;       // 类名
    private String methodName;      // 方法名
    private String requestIp;       // 请求IP
    private String userId;          // 用户ID
    private Date createTime;        // 创建时间
    private long duration;          // 耗时(毫秒)
    private Object params;          // 方法参数
    private Object result;          // 方法返回值

    // Getter 和 Setter 方法 省略
}

4. 在 Service 或 Controller 中使用注解

import org.springframework.stereotype.Service;

@Service
public class UserService {

    @LogRecord(businessType = "用户管理", operator = "删除用户")
    public String deleteUser(Long userId) {
        // 模拟业务逻辑
        return "用户已删除: " + userId;
    }
}
5. 配置 AOP 扫描路径(可选)
确保 Spring Boot 启动类启用了 AOP 扫描:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.EnableAspectJAutoProxy;

@SpringBootApplication
@EnableAspectJAutoProxy(exposeProxy = true)  // 启用 AOP
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}


6. 扩展功能建议
异步记录日志
使用 @Async 将日志记录异步化,避免影响业务性能  

@Async
private void saveLogAsync(LogRecordDO log) {
    // 异步保存日志
}

日志脱敏

在 getMethodParams 中对敏感参数(如密码)进行脱敏处理  

if (arg instanceof User) {
    ((User) arg).setPassword("****");
}
异常处理
在 @Around 中捕获异常并记录错误日志:

try {
    result = joinPoint.proceed();
} catch (Exception e) {
    log.setError(e.getMessage());
    throw e;
}
日志存储优化
将日志存储到数据库或文件系统(如使用 log4j、logback 等框架)  

7. 示例输出
调用 deleteUser(1001) 后,控制台输出类似以下内容:

【日志记录】LogRecordDO{
  businessType=用户管理,
  operator=删除用户,
  className=com.example.service.UserService,
  methodName=deleteUser,
  requestIp=127.0.0.1,
  userId=123456,
  createTime=2024-05-10 10:00:00,
  duration=5ms,
  params=[1001],
  result=用户已删除: 1001
}


8. 注意事项
性能影响
日志记录可能影响性能,建议异步处理或限制记录频率
线程安全
避免在日志记录中使用共享变量,确保 ThreadLocal 或 HttpServletRequest 的正确使用

注解灵活性
可通过注解属性扩展功能(如指定日志级别、模块分类等)

上一篇     下一篇
find grep 文件查找和索索

Spring AI + Milvus 实现 RAG 智能问答

CPI PPI PMI

词向量 Word Embedding

spring事务的一些知识点

MyBatis Plus 动态数据源注解 @DS 注解