Aop自定义注解生成日志

Aop自定义注解生成日志

1.编写自定义注解

//表示此注解可以标注在方法上
@Target(ElementType.METHOD)
//运行时生效
@Retention(RetentionPolicy.RUNTIME)
public @interface OpetionLog {
	//定义一个变量,可以接收参数
    String  value() default "";

}

2.Controller

    @PostMapping("updatestate/{id}")
    @ApiOperation("更改科室启用状态")
    @OpetionLog("更改科室启用状态")
    public Result updateStatus(@PathVariable Integer id) throws UnknownHostException {
        log.info("修改科室启用状态");
        return departmentService.updateStatus(id);
    }

3.切面类(控制台日志)

@Component
@Aspect
public class ParamaterLogAop {

    private static Logger log =           Logger.getLogger(String.valueOf(ParamaterLogAop.class));
    private long start = 0;
    @Pointcut("execution(* com.aaa.controller.*.*(..))")

	//切面签名
    public  void  haha(){}

    @Before("haha()")
    public  void  before(JoinPoint point){

        ServletRequestAttributes requestAttributes = (ServletRequestAttributes)           RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = requestAttributes.getRequest();
        HttpServletResponse response = requestAttributes.getResponse();

        String addr = request.getRemoteAddr();
        String uri = request.getRequestURI();
        Object[] args = point.getArgs();

        start = System.currentTimeMillis();
        log.info("===================请求的地址是:================="+addr);
        log.info("===================请求的路径是:================="+uri);
        log.info("===================请求的参数是:================="+ Arrays.toString(args));
    }

    @AfterReturning("haha()")
    public  void  after(){
        long end = System.currentTimeMillis();
        log.info("=================耗时================="+ (end-start));
        log.info("=================结束了=================");
    }
}

4.切面类(数据库日志表)

@Component
@Aspect
public class OptionsLogAop {
    @Resource
    private HttpSession httpSession;
    @Resource
    private LogsMapper logsMapper;

    @AfterReturning(pointcut = "@annotation(opetionLog)", returning = "result")
    public void insertLog(JoinPoint joinPoint, OpetionLog opetionLog, Result result) throws UnknownHostException {
        //获取日志信息
        
        //获取当前时间
        String logTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
        //获取当前操作人ip地址
        String addr = InetAddress.getLocalHost().getHostAddress();
        //获取登录人员姓名
        String name = ((DoctorDTO)httpSession.getAttribute("doctor")).getName();
        //操作类型
        String operation = opetionLog.value();
        //操作数据
        Object[] args = joinPoint.getArgs();
        //操作结果
        String code = result.getCode().toString();
        //日志对象
        LogsDTO logsDTO = new LogsDTO(null, name, operation, logTime, addr, Arrays.toString(args), code);
        //插入数据库
        logsMapper.insertLogs(logsDTO);
    }
}

4.1LogsDTO

@Data
@AllArgsConstructor
@NoArgsConstructor
public class LogsDTO implements Serializable {
    private static final long serialVersionUID = -28616532886171515L;
    
    private Integer id;
    
    private String name;
    
    private String operation;
    
    private String time;
    
    private String addr;
    
    private String data;
    
    private String result;
}

4.2LogsMapper

int insertLogs(LogsDTO logsDTO);


//Logsmapper.xml
<insert id="insertLogs">
        insert into logs
        values (null, #{name}, #{operation},#{time},
                #{addr},#{data},#{result})
</insert>

5.结果

5.1控制台

Aop自定义注解生成日志_第1张图片

5.2数据库日志表

Aop自定义注解生成日志_第2张图片

你可能感兴趣的:(Java学习,java)