Java知识点整理正在进行中,关注我,持续给您带来简单,实用的Java编程技巧。
最近在做一个接口项目,需要一个能够记录接口运行情况的监控日志。想在日志中记录:
结合具体的使用环境,还需要:
针对以上要求,结合前阵子做过的一个自定义注解记录接口运行时间的例子,发现这个需求可以认为是之前例子的升级版。整体思路梳理了下:
这样做就可以实现:
好,说干就干,代码开撸。
org.springframework.boot
spring-boot-starter-aop
com.google.guava
guava
23.0
com.alibaba
fastjson
1.2.75
package com.bbzd.mws.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 用于监控日志的注解
* @author mill
* @date 2022/10/14 - 11:54
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MonitorLog {
String value();
}
package com.bbzd.mws.aop;
import com.alibaba.fastjson.JSON;
import com.bbzd.mws.annotation.MonitorLog;
import com.google.common.base.Stopwatch;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
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;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
/**
* 业务监控日志
* 记录内容:请求IP,请求URI,业务类名,方法名,输入参数,返回值,异常信息
* @date 2022/10/12 - 10:12
*/
@Component
@Aspect
public class RequestParameterAOP {
//以注解MonitorLog标记的方法为切入点
@Pointcut("@annotation(com.bbzd.mws.annotation.MonitorLog)")
public void methodArgs(){}
@Around("methodArgs()")
public Object invoke(ProceedingJoinPoint joinPoint) throws Throwable{
StringBuffer stringBuffer=new StringBuffer();
Object result=null;
Stopwatch stopwatch = Stopwatch.createStarted();
HttpServletRequest httpServletRequest =
((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
String ipAddr=getRemoteHost(httpServletRequest);
String requestUrl=httpServletRequest.getRequestURI();
stringBuffer.append("
请求源IP["+ipAddr+"];");
stringBuffer.append("请求URL["+requestUrl+"];");
Signature signature=joinPoint.getSignature();
MethodSignature methodSignature=(MethodSignature)signature;
// 类名
String[] sourceName = signature.getDeclaringTypeName().split(".");
String fullName=signature.getDeclaringTypeName();
String className = sourceName[sourceName.length - 1];
// 方法名
String methodName = signature.getName();
stringBuffer.append("
"+className+"."+methodName+";");
// 参数名数组
String[] parameterNames = methodSignature.getParameterNames();
Class[] parameterTypes=methodSignature.getParameterTypes();
// 构造参数组集合
List
@Override
//com.bbzd.mws.aop是logger的名称,需要在日志文件中进行对应的配置
@MonitorLog(value = "com.bbzd.mws.aop")
public User getUserName(@Valid @RequestBody @WebParam(name="UserVo") UserVo vo) throws ConstraintViolationException {
User user = new User(vo.getName(), vo.getAge());
try{
//模拟异常情况,测试异常信息的记录
//int i=1/0;
}catch(NullPointerException exception){
exception.printStackTrace();
}
return user;
}
[11:11:59.266][INFO][com.bbzd.mws.aop][http-nio-8889-exec-1]
请求源IP[127.0.0.1];请求URL[/mws/ws/user];
UserServiceImpl.getUserName;
请求参数:["vo"]->[{"name":"powerful","age":10}]
请求结果:{"name":"powerful","age":10}
请求耗时:56毫秒
总结
页面更新:2024-04-29
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号