Springboot 2 AOP 로그 설정 방법 절차

17696 단어 Springboot2AOP로그
Spring boot 2 설정 AOP 전치 증강,전치 증강,이상 증강,서 라운드 증강,최종 증강
AOP 절단면 과 관련 된 구체 적 인 개념 에 대해 지나치게 논술 하지 않 는 다(개념 을 이해 하 는 것 이 사상 을 이해 하 는 데 유리 하 다).이것 은 AOP 를 설정 하 는 각종 증강 로그 로 로그 가 업무 코드 에 포 함 된 번 거 로 움 과 비 과학적 인 문 제 를 해결 하 는 것 이다.
먼저 Git demo 프로젝트 를 진행 해 보 겠 습 니 다.  https://github.com/zhang-xiao-xiang/boot-aop   (업데이트
1pom 의존(로그 프레임 워 크 로 로그 4j 2 를 사용 합 니 다.로그 4j 나 다른 로그 프레임 워 크 보다 효율 적 이 고 기능 이 강하 기 때 문 입 니 다)

    <!--   log4j2  (        ) -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-log4j2</artifactId>
    </dependency>
    <!--   exclude spring-boot   log     -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter</artifactId>
      <exclusions>
        <exclusion>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-logging</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
    <dependency>
      <!--          log4j2.yml  (                ,    yml) -->
      <groupId>com.fasterxml.jackson.dataformat</groupId>
      <artifactId>jackson-dataformat-yaml</artifactId>
    </dependency>
    <!--AOP     -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-aop</artifactId>
    </dependency>
2.절단면 류 작성 

package com.example.nba.aop;//        
 
import java.util.Arrays;
 
 
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
 
import javax.servlet.http.HttpServletRequest;
 
/**
 * AopLog
 *
 * @author 10905 2019/1/4
 * @version 1.0
 */
@Aspect
@Component
public class AopLog {
  //  org.slf4j.Logger,  Spring       
  private final static Logger logger = LoggerFactory.getLogger(AopLog.class);
 
  //	         :    AOP   (        service,         controller  ,          
  //	         ,         (  ,  ,   )      (    ,      )    )
    @Pointcut("execution(* com.example.nba.controller.PlayerApi.*(..))")
  // @Pointcut("execution(* com.example.nba.repository.PlayerRep.*(..))")
  //        ,        void,           
  public void mypointcut() {
  }
 
  //	    
  @Before("mypointcut()")
  public void Mybefore(JoinPoint jp) {
    logger.info("*    *   【" + jp.getTarget().getClass().getSimpleName() +
        "】 【" + jp.getSignature().getName() + "】   ,     【"
        + Arrays.toString(jp.getArgs()) + "】");
    //      ,      (                    )
    ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
    HttpServletRequest request = attributes.getRequest();
    logger.info("     URL : " + request.getRequestURL().toString());
    logger.info("     HTTP_METHOD : " + request.getMethod());
    logger.info("   IP : " + request.getRemoteAddr());
    logger.info("       : " + jp.getSignature().getDeclaringTypeName() + "." + jp.getSignature().getName());
    logger.info("     (    ) : " + Arrays.toString(jp.getArgs()));
 
  }
 
  //    
  @AfterReturning(pointcut = "mypointcut()", returning = "result")
  public void MyafterReturing(JoinPoint jp, Object result) {
    logger.info("*    *   【" + jp.getTarget().getClass().getSimpleName() +
        "】 【" + jp.getSignature().getName() + "】   ,     【" + result + "】");
  }
 
  //	      
  @AfterThrowing(pointcut = "mypointcut()", throwing = "e")
  public void afterThrowing(JoinPoint jp, RuntimeException e) {
    logger.error("*    *【" + jp.getSignature().getName().getClass().getSimpleName() + "】      【" + e + "】");
  }
 
  //	    
  @After("mypointcut()")
  public void afterLogger(JoinPoint jp) {
    logger.info("*    *【" + jp.getSignature().getName() + "】      。");
  }
 
  //    
  @Around("mypointcut()")
  public Object aroundLogger(ProceedingJoinPoint jp) throws Throwable {
    logger.info(" ==>>" + jp.getTarget().getClass().getName() + "     AOP    ==");
    logger.info("*    *  【" + jp.getTarget().getClass().getSimpleName() + "】 【 " + jp.getSignature().getName()
        + "】  。    【" + Arrays.toString(jp.getArgs()) + "】");
    try {
      Object result = jp.proceed();
      logger.info("*    *   " + jp.getTarget() + " 【 "
          + jp.getSignature().getName() + "】  。     【" + result + "】");
      return result;
    } catch (Throwable e) {
      logger.error(jp.getSignature().getName() + "       【" + e + "】");
      throw e;
    } finally {
      logger.info("*    *  finally【" + jp.getSignature().getName() + "】      <<==。");
    }
  } 
}
3.테스트(데이터베이스 코드 와 업무 층 등 코드 는 붙 이지 않 습 니 다.주로 AOP 의 pom 의존 과 절단면 류 를 참고 합 니 다),예 를 들 어 제 브 라 우 저 요청 등 입 니 다.
http://localhost:8080/player/findAll
컨트롤 러 표시:

json 형식의 op 설정(파일 형식 참조 에 주의 하여 판단 해 야 합 니 다(엑셀,PDF,png 등 형식 으로 json 을 돌 릴 수 없 기 때 문).현재 요구 사항 이 json 형식 을 위주 로 하고 로 그 를 데이터베이스 에 기록 하 는 것 이 라면(조회 로그 의 인 터 페 이 스 를 제외 하고 조회 로 그 를 데이터베이스 에 기록 할 필요 가 없 기 때 문 입 니 다.여 기 는 AOP 가 특정한 인 터 페 이 스 를 제외 하거나 특정한 절단면 이 라 고 할 수 있 습 니 다.구체 적 으로 보다
로그 실체(표)

package com.xinzuo.lvyou.pojo;
 
import java.io.Serializable;
import java.util.Date;
 
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
 
/**
 * <p>
 *        
 * </p>
 *
 * @author zhangxiaoxiang
 * @since 2019-07-08
 */
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class LogMonitor implements Serializable {
 
  private static final long serialVersionUID = 1L;
 
  /**
   *     ID
   */
  @TableId
  private String logId;
 
  /**
   *   IP  
   */
  private String requestIp;
 
  /**
   *         
   */
  private String summarize;
  /**
   *      
   */
  private Integer responseCode;
 
  /**
   *     
   */
  private String requestType;
 
  /**
   *     
   */
  private String requestApi;
 
  /**
   *     
   */
  private String requestPara;
 
  /**
   *     
   */
  private String responsePara;
 
  /**
   *          (  )
   */
  private Integer responseTime;
 
  /**
   *     (       )
   */
  private Date createTime;
 
  /**
   *     (0      ,1PC   )
   */
  private Integer belongTo;
}
다음은 제 이 슨 형식 이 고 데이터 베 이 스 를 기록 하 는 수요 가 있 습 니 다.만약 에 돌아 오 는 형식 이 3 단 제 이 슨 이 라면 다음 과 같 습 니 다.

{
  "code": 200,
  "msg": "        ",
  "data": {
    "photoSave": null,
    "user": null,
    "amount": 27
  }
}
절단면 류 의 작성 은 다음 과 같다.

package com.xinzuo.lvyou.aop;
 
import com.alibaba.fastjson.JSONArray;
import com.gexin.fastjson.JSON;
import com.gexin.fastjson.JSONObject;
import com.xinzuo.lvyou.dao.LogMonitorDao;
import com.xinzuo.lvyou.pojo.LogMonitor;
import com.xinzuo.lvyou.util.KeyUtil;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
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.util.Arrays;
import java.util.Date;
 
/**
 * AopLog:     
 *
 * @author zhangxiaoxiang
 * @date: 2019/05/22
 */
@Component
@Aspect
public class AopJsonLog {
  /**
   *         
   */
  @Autowired
  private LogMonitorDao logMonitorDao;
  //      
  LogMonitor logMonitor = new LogMonitor();
  long start = 0;
 
  /**
   *   org.slf4j.Logger,  Spring       
   */
  private final static Logger logger = LoggerFactory.getLogger(AopJsonLog.class);
 
  @Pointcut("execution(* com.xinzuo.lvyou.admin..*(..)) ")
  public void myPointcut() {
  }
 
  /**
   *                 
   *         ,             
   *         !execution(* com.xinzuo.lvyou.controller.LogMonitorController.*(..))
   *
   * @param jp
   */
  @Before("execution(* com.xinzuo.lvyou.controller..*(..)) && !execution(* com.xinzuo.lvyou.controller.LogMonitorController.*(..))")
  public void MyBefore(JoinPoint jp) {
    logger.info("---------------------------------        ----------------------------------------------");
    //      ,      (                    )
    ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
    HttpServletRequest request = attributes.getRequest();
    logger.info("     :" + jp.getTarget().getClass().getName() + "." + jp.getSignature().getName());
    try {
      logger.info("     :" + new JSONArray(Arrays.asList(jp.getArgs())).toString());
    } catch (Exception e) {
      logger.info("     :  ,  ,excel,PDF   (       JSON  )");
      //            json      ,       ,   ,             
      //e.printStackTrace();
    }
    //logger.info("     URL:      " + request.getRequestURL().toString());
    //logger.info("     HTTP_METHOD:  " + request.getMethod());
    //logger.info("   IP:        " + request.getRemoteAddr());
 
    start = System.currentTimeMillis();
    logMonitor.setLogId(KeyUtil.genUniqueKey());
    logMonitor.setRequestType(request.getMethod());
    logMonitor.setRequestApi(jp.getTarget().getClass().getName() + "." + jp.getSignature().getName());
    try {
      logMonitor.setRequestPara(new JSONArray(Arrays.asList(jp.getArgs())).toString());
    } catch (Exception e) {
      logMonitor.setRequestPara("     :  ,  ,excel,PDF   (       JSON  )");
    }
    logMonitor.setRequestIp(request.getRemoteAddr());
    logMonitor.setCreateTime(new Date());
 
 
  }
 
  /**
   *     
   *         !execution(* com.xinzuo.lvyou.controller.LogMonitorController.*(..))
   *         ,             
   * @param jp
   * @param vo
   */
  @AfterReturning(pointcut = "execution(* com.xinzuo.lvyou.controller..*(..)) && !execution(* com.xinzuo.lvyou.controller.LogMonitorController.*(..))", returning = "vo")
  public void MyafterReturing(JoinPoint jp, Object vo) {
 
    //logger.info("     : " + jp.getTarget().getClass().getName() + "." + jp.getSignature().getName());
    //    json    
//    try {
//      logger.info("     :" + new JSONArray(Arrays.asList(jp.getArgs())).toString());
//    } catch (Exception e) {
//      logger.info("       ,  ,excel,PDF   (       JSON  )");
//      //            json      ,       ,   ,             
//      //e.printStackTrace();
//    }
    logger.info("     :" + JSON.toJSONString(vo));
    logMonitor.setResponsePara(JSON.toJSONString(vo));
    long end = System.currentTimeMillis();
    //  json
    JSONObject json= null;
    try {
      json = JSON.parseObject(JSON.toJSONString(vo));
      logMonitor.setResponseCode(Integer.valueOf(json.get("code").toString()));
      logMonitor.setSummarize(json.get("msg").toString());
    } catch (Exception e) {
      logMonitor.setSummarize("    ,  ,excel,PDF     (          ,               200,     )");
      logMonitor.setResponseCode(200);
      //e.printStackTrace();
    }
 
 
    logMonitor.setBelongTo(0);
    logMonitor.setResponseTime((int) (end - start));
    try {
      logMonitorDao.insert(logMonitor);
    } catch (Exception e) {
      logger.info("AOP    !");
    }
  }
 
//  /**
//   *       
//   *
//   * @param jp
//   * @param e
//   */
//  @AfterThrowing(pointcut = "myPointcut()", throwing = "e")
//  public void afterThrowing(JoinPoint jp, RuntimeException e) {
//    logger.error("    :" + jp.getSignature().getName().getClass().getSimpleName() + "      【" + e + "】");
//  }
 
  /**
   *      :     finally          ,            ,        
   *
   * @param jp
   * @return
   * @throws Throwable
   */
  @Around("myPointcut()")
  public Object aroundLogger(ProceedingJoinPoint jp) throws Throwable {
 
    logger.info("admin---------------------------------        ----------------------------------------------");
    logger.info("     :" + jp.getTarget().getClass().getName() + "." + jp.getSignature().getName());
    //    json    
 
    try {
      logger.info("     :" + new JSONArray(Arrays.asList(jp.getArgs())).toString());
    } catch (Exception e) {
      logger.info("     :  ,  ,excel,PDF   (       JSON  )");
      //            json      ,       ,   ,             
      //e.printStackTrace();
    }
 
    try {
      Object result = jp.proceed();
      logger.info("     :" + JSON.toJSONString(result));
      return result;
    } catch (Throwable e) {
      logger.info("     :" + jp.getTarget().getClass().getName() + "." + jp.getSignature().getName());
      logger.info("     :" + new JSONArray(Arrays.asList(jp.getArgs())).toString());
      logger.error(jp.getSignature().getName() + "       【" + e + "】");
      throw e;
    } finally {
      //logger.info("     : " + jp.getTarget().getClass().getName() + "."+jp.getSignature().getName());
      //logger.info("     : "+ new JSONArray(Arrays.asList(jp.getArgs())).toString());
      //logger.info("     :" + jp.getSignature().getName() + "    。");
    }
  } 
}
다음은 spring AOP 설정 에 필요 한 추가 의존 입 니 다. 

    <dependency>
      <groupId>aopalliance</groupId>
      <artifactId>aopalliance</artifactId>
      <version>1.0</version>
    </dependency>  
    <dependency>
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjrt</artifactId>
      <version>1.6.12</version>
    </dependency>
    <dependency>
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjweaver</artifactId>
      <version>1.6.12</version>
    </dependency>
    <dependency>
      <groupId>cglib</groupId>
      <artifactId>cglib</artifactId>
      <version>2.2</version>
    </dependency>
Springboot 2 에서 AOP 로 그 를 설정 하 는 방법 과 절차 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.Springboot 2 에서 AOP 로 그 를 설정 하 는 내용 에 대해 서 는 예전 의 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 도 많은 응원 부 탁 드 리 겠 습 니 다!

좋은 웹페이지 즐겨찾기