springboot-切面日志
当使用AOP实现日志记录功能时,需要进行以下步骤:
创建切面类 BussinessLogAspect:
```java
@Slf4j
@Aspect
@Component
public class BussinessLogAspect {
@Autowired
private SysLogService logService;
// 定义切点,指定被 @BussinessLog 注解标记的方法为切点
@Pointcut(value = "@annotation(com.zyd.blog.business.annotation.BussinessLog)")
public void pointcut() {
}
// 环绕通知,在方法执行前后执行
@Around("pointcut()")
public Object writeLog(ProceedingJoinPoint point) throws Throwable {
// 先执行业务方法
Object result = point.proceed();
try {
handle(point); // 处理日志记录
} catch (Exception e) {
log.error("日志记录出错!", e);
}
return result;
}
// 处理日志记录
private void handle(ProceedingJoinPoint point) throws Exception {
// 获取目标方法对象
Method currentMethod = AspectUtil.INSTANCE.getMethod(point);
// 获取操作名称和其他注解属性值
BussinessLog annotation = currentMethod.getAnnotation(BussinessLog.class);
boolean save = annotation.save();
PlatformEnum platform = annotation.platform();
String bussinessName = AspectUtil.INSTANCE.parseParams(point.getArgs(), annotation.value());
String ua = RequestUtil.getUa();
// 在控制台打印日志
log.info("{} | {} - {} {} - {}", bussinessName, RequestUtil.getIp(), RequestUtil.getMethod(), RequestUtil.getRequestUrl(), ua);
if (!save) {
return;
}
// 保存日志到数据库
logService.asyncSaveSystemLog(platform, bussinessName);
}
}
创建自定义注解 @BussinessLog:
```java
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface BussinessLog {
String value() default ""; // 操作名称
boolean save() default false; // 是否保存日志到数据库
PlatformEnum platform() default PlatformEnum.UNKNOWN; // 平台类型
}
在目标方法上添加 @BussinessLog 注解,并指定相应属性值:
@Service
public class UserService {
@BussinessLog(value = "用户登录", save = true, platform = PlatformEnum.WEB)
public void login(String username, String password) {
// 用户登录逻辑
// ...
// 在方法内部打印日志
log.info("用户登录成功,用户名: {}", username);
}
}
在上述代码中,我们在 UserService 类的 login 方法上添加了 @BussinessLog 注解,并指定了操作名称为 “用户登录”,将日志保存到数据库,并指定平台类型为 PlatformEnum.WEB。在方法内部,我们通过 log.info() 方法打印了一条日志,记录了用户登录成功的信息。
当调用 UserService 的 login 方法时,AOP切面会拦截该方法的执行,在方法执行前后记录日志,并根据注解的配置决定是否将日志保存到数据库。
[1]: http://www.lgzcloud.top/