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 注解