Springboot 2 AOP 로그 설정 방법 절차
17696 단어 Springboot2AOP로그
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 로 그 를 설정 하 는 내용 에 대해 서 는 예전 의 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 도 많은 응원 부 탁 드 리 겠 습 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Firebase의 새로운 SDK를 사용하고 싶다면 Cocoapods 1.0.0 이상을 사용하십시오.요 전날 공개된 Firebase의 새로운 SDK를 사용하고 싶은 경우는, Cocoapods의 1.0.0 이상을 이용해 SDK의 도입을 실시한다. 로깅시의 AOP 라이브러리에서 Aspects를 이용하고 있는 경우에, ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.