Spring集成日志

目录

Spring集成日志及应用

集成log4g2

应用一:

1、创建日志实体

2、创建工具类

3、测试

应用二:通过AOP为指定方法添加日志支持


Spring集成日志及应用

集成log4g2

详看工具包中的日志

应用一:

1、创建日志实体

import com.xxx.util.JsonUtil;
 import lombok.Getter;
 ​
 import java.time.LocalDateTime;
 ​
 @Getter
 public class LogBean {
     //log4j2往文件中写数据时需要调用到每个属性的setter方法
 ​
     private Integer id;
 ​
     /**
      * 操作人id
      */
     private Integer userId;
 ​
     /**
      * 用户操作
      */
     private String operation;
 ​
     /**
      * 所调用的方法
      */
     private String method;
 ​
     /**
      * 调用方法的参数
      */
     private String params;
 ​
     /**
      * 方法返回值
      */
     private String result
 ​
     /**
      * 用户的ip地址
      */
     private String ip;
 ​
     /**
      * 操作的时间
      */
     private LocalDateTime createTime;
 ​
     private LogBean() {
     }
 ​
     public LogBean(Integer userId, String operation, String method, String result, String params, String ip, LocalDateTime createTime) {
         this.userId = userId;
         this.operation = operation;
         this.method = method;
         this.result = result;
         this.params = params;
         this.ip = ip;
         this.createTime = createTime;
     }
 ​
     @Override
     public String toString() {
         return JsonUtil.obj2String(this);
     }
 }

2、创建工具类

工具类接口

 public interface LogUtil {
     void info(LogBean logBean);
     void warn(LogBean logBean);
     void error(LogBean logBean);
     void debug(LogBean logBean);
     void trace(LogBean logBean);
 }

工具类实现类

 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Component;
 ​
 @Component("LogUtil")
 @Slf4j
 public class LogUtilImpl implements LogUtil {
     @Override
     public void info(LogBean logBean) {
         log.info(logBean.toString());
     }
 ​
     @Override
     public void warn(LogBean logBean) {
         log.warn(logBean.toString());
     }
 ​
     @Override
     public void error(LogBean logBean) {
         log.error(logBean.toString());
     }
 ​
     @Override
     public void debug(LogBean logBean) {
         log.debug(logBean.toString());
     }
 ​
     @Override
     public void trace(LogBean logBean) {
         log.trace(logBean.toString());
     }
 }

3、测试

 import org.junit.jupiter.api.Test;
 import java.time.LocalDateTime;
 ​
 class LogUtilImplTest {
 ​
     LogUtil logUtil = new LogUtilImpl();
 ​
     @Test
     void info() {
         logUtil.info(new LogBean(123, "123", "123", "123", "123", LocalDateTime.now()));
     }
 }

应用二:通过AOP为指定方法添加日志支持

 import com.xxx.constant.WegoConst;
 import com.xxx.domain.User;
 import lombok.extern.slf4j.Slf4j;
 import org.aspectj.lang.JoinPoint;
 import org.aspectj.lang.annotation.After;
 import org.aspectj.lang.annotation.AfterReturning;
 import org.aspectj.lang.annotation.AfterThrowing;
 import org.aspectj.lang.annotation.Aspect;
 import org.aspectj.lang.annotation.Pointcut;
 import org.springframework.stereotype.Component;
 import org.springframework.web.context.request.RequestContextHolder;
 import org.springframework.web.context.request.ServletRequestAttributes;
 ​
 import javax.servlet.http.HttpServletRequest;
 import java.time.LocalDateTime;
 import java.util.Arrays;
 ​
 @Slf4j
 @Component
 @Aspect
 public class LogAdvance {
 ​
     //切入点
     @Pointcut("execution(* com.xxx.controller..*.*(..))")
     public void logPointcut() {
     }
 ​
     /**
      * 后置增强
      *
      * @param joinPoint 可以通过joinPoint获取所执行的方法以及该方法传入的参数
      */
     @After("logPointcut()")
     public void afterMethod(JoinPoint joinPoint) {
         String methodName = joinPoint.getSignature().getName();
         Object[] params = joinPoint.getArgs();
         System.out.print(methodName + " " + Arrays.toString(params));
         //记录日志
         log(methodName, params, "");
     }
 ​
     private void log(String methodName, Object[] params, String result) {
         //获取传递的参数值
         HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
         User user = (User) request.getSession().getAttribute(WegoConst.SESSION_USER);
         Long userId = null;
         if (user != null) {
             userId = user.getId();
         }
         //TODO: 获取用户的真实IP
         String ip = "";
 ​
         log.info(new LogBean(userId, "", methodName, Arrays.toString(params), ip, LocalDateTime.now(), result).toString());
     }
 ​
     /**
      * 返回增强
      *
      * @param joinPoint 可以通过joinPoint获取所执行的方法以及该方法传入的参数
      * @param result    获取该方法的返回值
      */
     @AfterReturning(pointcut = "logPointcut()", returning = "result")
     public void afterReturningMethod(JoinPoint joinPoint, int result) {
         String methodName = joinPoint.getSignature().getName(); //获取方法名
         Object[] params = joinPoint.getArgs(); //获取参数列表
         System.out.print(methodName + " " + Arrays.toString(params) + " " + result);
         //记录日志
         log(methodName, params, result + "");
     }
 ​
     /**
      * 异常增强
      *
      * @param joinPoint 可以通过joinPoint获取所执行的方法以及该方法传入的参数
      * @param ex        该方法所产生的异常
      */
     @AfterThrowing(pointcut = "logPointcut()", throwing = "ex")
     public void afterThrowingMethod(JoinPoint joinPoint, ArithmeticException ex) {
         String methodName = joinPoint.getSignature().getName();
         Object[] params = joinPoint.getArgs();
         System.out.print(methodName + " " + Arrays.toString(params) + " " + ex);
         //记录日志
         log(methodName, params, ex.getMessage());
     }
 ​
 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值