在Springboot项目中使用AOP进行保存日志

AOP术语

  • target:目标类,即需要被代理的类。例如:UserService

  • Joinpoint(连接点):所谓连接点是指那些可能被拦截到的方法。例如:所有的方法

  • PointCut切入点︰已经被增强的连接点。例如: addUser()

    image-20210318100738814

  • advice通知/增强,增强代码。例如: after、before

  • Weaving(织入):是指把增强advice应用到目标对象target来创建新的代理对象proxy的过程.

  • proxy 代理类

  • Aspect(切面):是切入点pointcut和通知advice的结合

常见的通知 五种Advice

  • 前置通知:在我们执行目标方法之前运行(@Before)
  • 后置通知:在我们目标方法运行结束之后,不管有没有异常(@After)
  • 返回通知:在我们的目标方法正常返回值后运行(@AfterReturning)
  • 异常通知:在我们的目标方法出现异常后运行(@AfterThrowing)
  • 环绕通知:动态代理,需要手动执行joinPoint.procced()(其实就是执行我们的目标方法执行之前相当于前置通知,执行之后就相当于我们后置通知(@Around)

excution表达式

  • excution(

    • 修饰符 pattern
    • 返回值 pattern
    • 描述包名
    • 方法名(参数)
    • 方法抛出异常 pattern

    )

实例:

@Pointcut("execution(* com.onlylmf.controller.*.*(..))")
    public void log() {}

Java日志

  • 日志: 保存描述系统运行状态的信息

  • 日志框架: 能实现日志输出的工具包

  • 日志框架的功能: 定制输出目标、格式、选择性输出

  • 常见的日志框架:

    • 日志门面: 是日志实现的抽象层: 如JCL、SLF4j
    • 日志实现: 具体的日志功能的实现: 如JUL、log4j、log4j2、logback
  • slf4j是Java的一个日志门面,实现了日志框架一些通用的api;

  • logback是具体的日志框架。它和log4j是同一个作者,他是为了解决log4j存在的问题而开发的新的日志框架。

  • slf4j和logback可以简单的看作jdbc和其具体数据库的JDBC的jar包的关系。

  • 推荐使用slf4j,而不是直接使用logback。

image-20210318205105329

系统默认只打印info级别以上的日志

测试:

在配置中配置等级信息 配置输出debug级别以上的日志

image-20210318210025680

测试

image-20210318210118373


也可以使用lombok插件 在使用中加入注解@Slf4j

log.info("这是info级别的日志");
log.debug("这是debug级别的日志");
log.error("这是error级别的日志");

效果是一样的 而且不用实现

private final Logger logger = LoggerFactory.getLogger(this.getClass());
@RequestMapping("/save")
    @ResponseBody
    public R save(Pets pets, @RequestParam("imageFile")MultipartFile file, HttpServletRequest request)throws Exception {
   // System.out.println(file);
    JSONObject json = new JSONObject();
        if (!file.isEmpty()) {
            String filePath = "E:/idea/springBoot/pet_adoption/src/main/resources/static/picture/";//上传到这个文件夹
            java.io.File file1 = new java.io.File(filePath);
            if (!file1.exists()) {
                file1.mkdirs();
            }
            // 获取图片的名字
            String fileName = file.getOriginalFilename();

            // 防止图片名字相同而出现bug,使用 uuid 加密
            String hToken = UUID.randomUUID().toString();

            // 加密后的图片名字:uuid + 图片名字
            String HeadName = hToken + fileName;

            //System.err.println("HeadName" + HeadName);

            String finalFilePath = filePath + HeadName;
            pets.setPetPictures(finalFilePath);

            java.io.File desFile = new File(finalFilePath);
            if (desFile.exists()) {
                desFile.delete();
            }
            try {
                file.transferTo(desFile);
                pets.setPetPictures(HeadName);


                json.put("code", 0);
            } catch (Exception e) {
                System.out.println(e.getMessage());
                json.put("code", 1);
            }
        }
        pets.setPetsTime(new Date());
        petsService.addPets(pets);
        return R.ok();

    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值