spring AOP自定义注解方式实现日志管理

Posted cp2018

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring AOP自定义注解方式实现日志管理相关的知识,希望对你有一定的参考价值。

1、编写自定义注解

  

package com.eshore.zswh.common.annotation;

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

/**
* @author chengp
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface AddOperLog {

/**
* 业务操作
*/
String value() default "";

/**
* 业务描述
*/
String desc() default "";
}

2、编写切面

package com.eshore.zswh.admin.aop;

import com.eshore.zswh.admin.service.sys.ISysOperLogService;
import com.eshore.zswh.common.annotation.AddOperLog;
import com.eshore.zswh.common.entity.sys.SysOperLog;
import com.eshore.zswh.common.exception.ApiException;
import com.eshore.zswh.common.support.ResultCode;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;

/**
* 系统日志记录 切面
*
* @author chengp
* @date 2019/10/12
*/
@Slf4j
@Aspect
@Component
public class SysLogAspect {

@Resource
private ISysOperLogService sysOperLogService;

@Around("@annotation(com.eshore.zswh.common.annotation.AddOperLog)")
public Object around(ProceedingJoinPoint pjp) throws Throwable {
// 获取注解信息
MethodSignature sign = (MethodSignature) pjp.getSignature();
AddOperLog operLog = sign.getMethod().getAnnotation(AddOperLog.class);

SysOperLog log = new SysOperLog();
try {
  // 开始执行
  log.setOperation(operLog.value());
  log.setDescription(operLog.desc());

  // 执行目标方法
  Object result = pjp.proceed();

  // 执行成功
  log.setResultCode(ResultCode.SUCCESS.getCode());
  log.setResultDesc(ResultCode.SUCCESS.getMsg());
  return result;
} catch (Throwable e) {
  // 执行异常
  if (e instanceof ApiException) {
    log.setResultCode(((ApiException) e).getCode());
    log.setResultDesc(e.getMessage());
  } else {
    log.setResultCode(ResultCode.FAILURE.getCode());
    log.setResultDesc("系统错误");
  }

  // 这里的异常需要抛出,交给全局异常处理
  throw e;
  } finally {
  sysOperLogService.save(log);
    }
  }

}

 

3、ApiException是自定义接口请求异常类,用来管理接口可能出现的错误

   

package com.eshore.zswh.common.exception;

import com.eshore.zswh.common.support.IResultCode;
import com.eshore.zswh.common.support.ResultCode;
import lombok.Getter;

/**
* 接口请求异常类
*
* @author chengp
*/
@Getter
public class ApiException extends RuntimeException {

/**
* 错误码
*/
private int code;

public ApiException(IResultCode resultCode) {
  this(resultCode.getCode(), resultCode.getMsg());
}

public ApiException(String msg) {
  this(ResultCode.FAILURE.getCode(), msg);
}

public ApiException(int code, String msg) {
  super(msg);
  this.code = code;
}

public ApiException(Throwable cause) {
  super(cause);
  this.code = ResultCode.FAILURE.getCode();
}
}

4、存入数据库的对象 SysOperLog 

package com.eshore.zswh.common.entity.sys;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import java.io.Serializable;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;

/**
* <p>
* 系统操作日志
* </p>
*
* @author CodeGenerator
* @date 2019-10-18
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@ApiModel(value = "SysOperLog对象", description = "系统操作日志")
public class SysOperLog implements Serializable {

private static final long serialVersionUID = 1L;

@ApiModelProperty(value = "主键")
@TableId(value = "id", type = IdType.AUTO)
private Long id;

@ApiModelProperty(value = "业务类型")
private String operation;

@ApiModelProperty(value = "业务描述")
private String description;

@ApiModelProperty(value = "状态")
private Integer resultCode;

@ApiModelProperty(value = "状态说明")
private String resultDesc;

@ApiModelProperty(value = "操作用户")
@TableField(fill = FieldFill.INSERT)
private String createBy;

@ApiModelProperty(value = "操作时间")
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;

}

 

以上是关于spring AOP自定义注解方式实现日志管理的主要内容,如果未能解决你的问题,请参考以下文章

spring AOP自定义注解 实现日志管理

(转)利用Spring AOP自定义注解解决日志和签名校验

使用Spring Aop自定义注解实现自动记录日志

Spring AOP 实现写事件日志功能

log4j +spring aop+自定义注解方式输出日志

SpringAOP拦截Controller,Service实现日志管理(自定义注解的方式)