利用自定义注解+aop实现日志打印

利用aop来实现web项目请求中的参数,从而实现日志的记录,是很常用的功能。自己从网上找到了一些例子和自己的总结。

1.声明自定义注解

@Target(ElementType.METHOD) // 方法注解
@Retention(RetentionPolicy.RUNTIME) // 运行时可见
public @interface WebLog {
    String operateType();// 记录日志的操作类型
}

2.实现aop接口

@Aspect
@Component
public class WebLogAspect {

    private final Logger logger = LoggerFactory.getLogger(WebLogAspect.class);

    @Resource
    private LogMapper logMapper;

 
    @Around("@annotation(com.company.project.annotation.WebLog)")
    public Object   logAfterController(ProceedingJoinPoint pjp)  {
        //获取当前请求对象
        //这个RequestContextHolder是Springmvc提供来获得请求的东西
        RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = ((ServletRequestAttributes)requestAttributes).getRequest();

        // 获取方法签名
        MethodSignature methodSignature = (MethodSignature) pjp.getSignature();

        // 请求的方法
        String methodname = methodSignature.getMethod().getName();

        //请求的类名
        String ClassName=pjp.getSignature().getDeclaringTypeName();

        //请求的参数
        String ArgsName=Arrays.toString(pjp.getArgs());

        //IP地址
        String ipdress=request.getRemoteAddr();

        //请求URL
        String URL=request.getRequestURL().toString();

        //请求方式
        String WebMethod=request.getMethod();

        // 创建一个日志对象(准备记录日志)
        Log logSys  = new Log();

        //编号
        logSys.setLognum(UUID.randomUUID().toString());

        // 获取指定方法上面的注解
        WebLog logAnno = methodSignature.getMethod().getAnnotation(WebLog.class);

        // 获取操作描述的属性值
        String operateType = logAnno.operateType();
        logSys.setContent(operateType);



        SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
        Date d= new Date();
        String opertime = sdf.format(d);

        logSys.setCtime(new Date());

        //获取用户名  这里是使用了springSecurity 获取用户名  如果没有使用 可以删除
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        if (!(authentication instanceof AnonymousAuthenticationToken)) {
            //设置操作人id
            logSys.setPmid(Integer.valueOf(authentication.getName()));
        }
        else {
           logSys.setPmid(-1);
        }
        // 记录下请求内容
        logger.info("################请求地址为URL : " + URL);
        logger.info("################请求方式为 : " + WebMethod);
        logger.info("################IP地址为 : " + ipdress);
        logger.info("################传递的参数为 : " + ArgsName);
        logger.info("################调用的方法名 : " +methodname);
        logger.info("################完整类名为 : " + ClassName + "." + methodname);
        logger.info("################操作时间 : "+opertime );
        logger.info("################操作类型 : "+operateType);
        Object result =null;
        try {
            //代理方法执行
            result= pjp.proceed();
            logSys.setResult("操作成功");
            logMapper.insert(logSys);
            logger.info("################备注 : "+"操作成功");
        } catch (Throwable throwable) {
            logSys.setResult("操作失败:"+throwable.getMessage());
            logMapper.insert(logSys);
            logger.info("################备注 : "+"操作失败:"+throwable.getMessage());
            throw throwable;
        }
        return result;
    }

}

3.使用方法

在需要记录日志的方法中,使用该注解,如:登录成功,修改,删除等等。一般用在controller和service中

    /**
     * 添加广告
     * @param
     * @return
     */
    @PostMapping("/api/v1/notice/ad")

    @WebLog(operateType = "添加广告")

    public Result add(@RequestParam(value = "adName",required = true)String adNam,
                      @RequestParam(value = "adFile",required = false) MultipartFile adFile,
                      @RequestParam(value = "des",required = true)String des){

}

4.在使用了该注解的地方,可以手动抛出一些异常 , aop也能捕获到  如下

  throw  new ServiceException("广告增加失败");

5. 这样就会生成一个日志记录。使用aop实现

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
Java中,我们可以使用自定义注解实现AOP(面向切面编程)。AOP是一种编程范型,它允许开发者在程序运行时动态地将代码切入到已有代码的特定位置。 下面是一个简单的示例,演示如何使用自定义注解实现AOP。 首先,我们需要定义一个自定义注解: ``` @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface Loggable { } ``` 这个注解用来标记需要记录日志的方法。它的@Target注解指定了它只能用于方法上,@Retention注解指定了它的生命周期是运行时。 接下来,我们创建一个切面类,用来实现AOP的逻辑: ``` @Aspect @Component public class LoggingAspect { @Before("@annotation(com.example.Loggable)") public void logMethodCall(JoinPoint joinPoint) { String methodName = joinPoint.getSignature().getName(); System.out.println("Method " + methodName + " called"); } } ``` 这个类使用Spring AOP框架提供的@Aspect注解来标记它是一个切面类。它的@Before注解指定了它要在被@Loggable注解标记的方法之前执行。JoinPoint参数包含了被拦截的方法的信息,我们可以从中获取方法名等信息。 最后,在需要记录日志的方法上加上@Loggable注解即可: ``` @Component public class MyService { @Loggable public void doSomething() { // do something } } ``` 当doSomething()方法被调用时,LoggingAspect中的logMethodCall()方法会被执行,记录方法调用信息。 这就是使用自定义注解实现AOP的基本步骤。当然,实际应用中会更加复杂,需要更多的切面逻辑和注解参数等。但是这个简单的示例可以帮助你理解如何使用自定义注解实现AOP
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值