spring bootによるcontrolerログの切断処理
45785 ワード
spring bootによるcontrolerログの切断処理
問題の需要:プロジェクトにはログにインターフェースの着信値を記録する必要があります.インターフェースはipを呼び出して、インターフェースは時間を呼び出して、そして入庫します.
処理方式:controller層に断面処理を加える.
1.必要なカバン、springbootのaopカット面、二つのツール類、huotoolとjackson pomは以下の通りです.
aopサラウンドを利用して、うどん呼び出しデータ入庫処理を行う.
直接コード
問題の需要:プロジェクトにはログにインターフェースの着信値を記録する必要があります.インターフェースはipを呼び出して、インターフェースは時間を呼び出して、そして入庫します.
処理方式:controller層に断面処理を加える.
1.必要なカバン、springbootのaopカット面、二つのツール類、huotoolとjackson pomは以下の通りです.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-core</artifactId>
<version>4.5.18</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.0</version>
</dependency>
2.コード作成:/**
*
* - ControllerAspect
* - Description:
* - Copyright: Copyright (C) 2019
* - Company:
* - CreateDate: 2019/7/26
*
*
* @author hht
*/
@Component
@Aspect
public class ControllerAspect {
private Logger logger = LoggerFactory.getLogger(ControllerAspect.class);
// Pointcut
@Pointcut( "execution(* com.test.test.controller..*(..))")
public void executeController() {
}
@Before("executeController()")
public void before(JoinPoint joinPoint) throws Exception{
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) requestAttributes;
HttpServletRequest request = servletRequestAttributes.getRequest();
//
Method m = ((MethodSignature) joinPoint.getSignature()).getMethod();
// ,
if (joinPoint.getThis().getClass() != joinPoint.getTarget().getClass()) {
m = ReflectUtil.getMethod(joinPoint.getTarget().getClass(), m.getName(), m.getParameterTypes());
}
//
LocalVariableTableParameterNameDiscoverer paramNames = new LocalVariableTableParameterNameDiscoverer();
String[] parameterNames = paramNames.getParameterNames(m);
//
Object[] args = joinPoint.getArgs();
//
Map<String, Object> params = new HashMap<>();
//
if (!TextUtil.isEmpty(parameterNames)){
for (int i = 0; i < parameterNames.length; i++) {
// , requestParam , require=false,
if (TextUtil.isEmpty(args[i])){
continue;
}
// , ,
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.convertValue(args[i],args[i].getClass());
params.put(parameterNames[i],JSON.toJSON(objectMapper.convertValue(args[i],args[i].getClass())));
}
}
logger.info("before start:-------------------------------");
logger.info("URL : " + request.getRequestURL().toString());
logger.info("HTTP_METHOD : " + request.getMethod());
logger.info("IP : " + request.getRemoteAddr());
logger.info("CLASS_METHOD : " + joinPoint.getSignature().getDeclaringTypeName()+ "." + joinPoint.getSignature().getName());
// ,
logger.info("ARGS-JSON : " + params);
// ,
logger.info("ARGS : "+ Arrays.toString(joinPoint.getArgs()));
logger.info("before end:-------------------------------");
}
@AfterReturning(value = "executeController()",returning = "rtv")
public void after(JoinPoint joinPoint, Object rtv){
logger.info("before return+++++++++++++++++++++++++++");
logger.info("responseBody:"+JSON.toJSONString(rtv,SerializerFeature.WriteMapNullValue));
logger.info("end return++++++++++++++++++++++++++++++++");
}
}
以上は点を切って改正して直接使うことができるのでさえすれば、更に直観的なのは日誌のデータを見ることができて、正しくて、異常な処理のうどんをプラスしていません.aopサラウンドを利用して、うどん呼び出しデータ入庫処理を行う.
直接コード
public class ControllerAspect {
@Autowired
AsyncTask asyncTask;
private Logger logger = LoggerFactory.getLogger(ControllerAspect.class);
// Pointcut
@Pointcut( "execution(* com.test.web..*.*(..))")
public void executeController() {
}
@Before("executeController()")
public void before(JoinPoint joinPoint) throws Exception{
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) requestAttributes;
HttpServletRequest request = servletRequestAttributes.getRequest();
logger.info("before start:-------------------------------");
logger.info("URL : " + request.getRequestURL().toString());
logger.info("HTTP_METHOD : " + request.getMethod());
logger.info("IP : " + request.getRemoteAddr());
logger.info("CLASS_METHOD : " + joinPoint.getSignature().getDeclaringTypeName()+ "." + joinPoint.getSignature().getName());
logger.info("ARGS-JSON : " + CommonAop.getAopParam(joinPoint));
logger.info("ARGS : "+ Arrays.toString(joinPoint.getArgs()));
logger.info("before end:-------------------------------");
}
/**
*
*/
@Around("executeController()")
public Object around(ProceedingJoinPoint pjp) throws Throwable {
// !!!!! pjp.proceed() , , , hasnext() next()
Object object = pjp.proceed();
try {
//
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) requestAttributes;
HttpServletRequest request = servletRequestAttributes.getRequest();
// , ,
//CommonAop.getAopParam(pjp) , ProceedingJoinPoint JoinPoint
asyncTask.doInsertLog(request.getRequestURL().toString(),request.getRemoteAddr(), JSON.toJSONString(CommonAop.getAopParam(pjp),SerializerFeature.WriteMapNullValue),request.getMethod(),JSON.toJSONString(object,SerializerFeature.WriteMapNullValue));
}catch (Exception e){
e.printStackTrace();
}
return object;
}
@AfterReturning(value = "executeController()",returning = "rtv")
public void after(JoinPoint joinPoint, Object rtv){
logger.info("before return+++++++++++++++++++++++++++");
logger.info("responseBody:"+JSON.toJSONString(rtv,SerializerFeature.WriteMapNullValue));
logger.info("end return++++++++++++++++++++++++++++++++");
}
}
Common Aop
public class CommonAop {
public static Map<String,Object> getAopParam(JoinPoint joinPoint){
//
Method m = ((MethodSignature) joinPoint.getSignature()).getMethod();
// ,
if (joinPoint.getThis().getClass() != joinPoint.getTarget().getClass()) {
m = ReflectUtil.getMethod(joinPoint.getTarget().getClass(), m.getName(), m.getParameterTypes());
}
//
Object[] args = joinPoint.getArgs();
return CommonAop.getParam(m,args);
}
public static Map<String,Object> getParam(Method m,Object[] args){
//
LocalVariableTableParameterNameDiscoverer paramNames = new LocalVariableTableParameterNameDiscoverer();
String[] parameterNames = paramNames.getParameterNames(m);
//
Map<String, Object> params = new HashMap<>();
if (!TextUtil.isEmpty(parameterNames)){
for (int i = 0; i < parameterNames.length; i++) {
if (TextUtil.isEmpty(args[i])){
continue;
}
// , ,
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.convertValue(args[i],args[i].getClass());
params.put(parameterNames[i], JSON.toJSON(objectMapper.convertValue(args[i],args[i].getClass())));
}
}
return params;
}
}