疫情防控交流社区平台——补充:统一记录日志(重点)

🌕统一记录日志

在这里插入图片描述

一、为什么要日志

记录日志不是属于业务需求,而是系统需求
原始的方法就是:比如对业务做一个日志管理,如上图,那么代码耦合度比较高,又是业务代码,又是系统代码;有的业务中加日志,有的不加,就会很复杂,一个要改就会导致代码改动比较大。
所以最好办法就是就将系统需求拆分出去,单独实现;比如记录日志、权限检查、事务管理等;
那么什么技术能做到这一点呢?那就是Spring中的一大核心 —— AOP.

二、AOP概念

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三、AOP简单demo

demo创建在community项目之上

3.1 AlphaAspect

@Component
@Aspect
public class AlphaAspect {

    //定义一个切入点
    @Pointcut("execution(* com.yty.community.service.*.*(..))") //范围:第一个*表示什么返回值都行,然后service包下所有的类,所有的方法,所有的参数
    public void pointcut(){

    }

    @Before("pointcut()")
    public void before(){
        System.out.println("before");
    }

    @After("pointcut()")
    public void after(){
        System.out.println("after");
    }

    @AfterReturning("pointcut()")
    public void afterReturning(){
        System.out.println("afterReturning");
    }

    @AfterThrowing("pointcut()")
    public void afterThrowing(){
        System.out.println("afterThrowing");
    }

    @Around("pointcut()")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable{
        System.out.println("around before");
        Object obj = joinPoint.proceed();
        System.out.println("around after");
        return obj;
    }

}

写完之后,目前这些代码针对所有的service就都有效,并且service一行代码也没有改;这就是SpringAOP的强大之处。

3.2 测试

启动项目,并clear all 控制台,然后访问首页index
在这里插入图片描述
没有抛出这个:
在这里插入图片描述
是因为还没报错,报错就回抛,这里不试了。

四、⭐️统一记录日志

所有的业务组件进行日志

4.1 ServiceLogAspect

@Component
@Aspect
public class ServiceLogAspect {

    //因为要记日志,所以实例化一个log/或者直接使用后@Sl4j注解
    private static final Logger logger = LoggerFactory.getLogger(ServiceLogAspect.class);

    //1.声明切点
    @Pointcut("execution(* com.yty.community.service.*.*(..))") //范围:第一个*表示什么返回值都行,然后service包下所有的类,所有的方法,所有的参数
    public void pointcut(){

    }

    @Before("pointcut()")
    public void before(JoinPoint joinPoint){
        //格式: 用户[1.2.3.4],在[xxxTime],访问了[com.yty.community.service.xxx()]
        //要想获取这么一个格式,用户ip怎么获取?可通过request获取,但是这个方法里怎么去获取request对象呢,不能直接声明一个request对象,而是利用工具类,然后直接获取request了
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        String ip = request.getRemoteHost();
        String now = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
        //访问的是某个类某个方法,怎么知道我访问的是哪个类那个方法呢 —— 加一个参数JointPoint
        String target = joinPoint.getSignature().getDeclaringTypeName() + "." +joinPoint.getSignature().getName();

        logger.info(String.format("用户[%s],在[%s],访问了[%s].",  ip,now,target));
    }

}

在这里插入图片描述

4.2 测试

进入首页
在这里插入图片描述
然后看后台控制器:

[0:0:0:0:0:0:0:1] 代表的是本机localhost
看着不习惯,localhost可改成127.0.0.1
在这里插入图片描述

在这里插入图片描述
改成127.0.0.1.后的控制台:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

11_1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值