针对Java SpringBoot项目实现操作日志记录的攻略,主要包括以下几个方面:
一、使用AOP切面编程实现日志记录
AOP切面编程是Java Spring框架中的重要特性之一,通过定义切面和切入点,可以在程序中对方法进行增强,实现各个方面的统一处理。在日志记录方面,可以通过定义切面,对所有需要记录日志的方法进行切入。
- 创建自定义注解
首先,我们需要定义一个自定义注解,用于标记需要进行日志记录的方法。创建一个注解类,例如:@OperationLog。
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface OperationLog {
String value() default "";
}
- 创建切面类
实现记录日志的切面类,继承org.aspectj.lang.annotation.Aspect类,并在类上添加@Aspect注解。此外,还需要添加@Component注解让SpringBoot能够自动扫描到该类。
@Aspect
@Component
public class LogAspect {
@Autowired
private LogService logService;
@Pointcut("@annotation(OperationLog)")
public void pointCut() {
}
@Around("pointCut()")
public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
// 获取方法名称、参数等信息
String methodName = joinPoint.getSignature().getName();
Object[] args = joinPoint.getArgs();
String className = joinPoint.getTarget().getClass().getName();
// 日志记录开始时间
long beginTime = System.currentTimeMillis();
// 利用反射执行方法
Object result = joinPoint.proceed();
// 日志记录结束时间
long endTime = System.currentTimeMillis();
// 将日志信息保存到数据库
Log log = new Log(className, methodName, JSON.toJSONString(args), JSON.toJSONString(result), beginTime, endTime);
logService.save(log);
return result;
}
}
- 在需要记录日志的方法上添加注解
在需要记录日志的方法上添加@OperationLog注解即可。
@PostMapping("/user")
@ResponseBody
@OperationLog(value = "新增用户")
public Result addUser(@RequestBody User user) {
...
}
二、使用slf4j及logback实现日志记录
除了AOP切面编程,还可以使用slf4j及logback来实现日志记录,这样可以更方便地按照不同级别记录日志,并且可以自定义日志输出格式。
- 添加依赖
在pom.xml文件中添加以下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
</dependency>
- 配置application.properties
在application.properties文件中添加以下配置,其中,logging.pattern.console是用于控制台输出的格式,logging.pattern.file是用于记录文件输出的格式。
#控制台输出配置
logging.pattern.console=%d{[yyyy-MM-dd HH:mm:ss]} - [%thread] - [%logger] - [%level] - %msg%n
#日志文件输出配置
logging.pattern.file=%d{[yyyy-MM-dd HH:mm:ss]} - [%thread] - [%logger] - [%level] - [%file:%line] - %msg%n
logging.file.name=log/xxx.log
logging.file.total-size-cap=1024MB
logging.file.max-history=7
- 在代码中记录日志
在代码中使用slf4j及logback记录日志的方式非常简单,只需在类中声明log变量即可。
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class UserService {
private static final Logger logger = LoggerFactory.getLogger(UserService.class);
public User getUserById(int userId) {
logger.info("getUserById invoked, userId={}", userId);
User user = userDao.getUserById(userId);
logger.info("getUserById return, user={}", JSON.toJSONString(user));
return user;
}
}
以上是两个实现操作日志记录的示例,你可以根据自己项目的实际情况选择适合的方式。不同的实现方式各有优劣,需要根据项目实际情况选择。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java SpringBoot项目如何优雅的实现操作日志记录 - Python技术站