spring - 在 SpringBoot REST API 中记录经过的执行时间
问题描述
这可能是一个简单的解决方案,但我无法完成它。我需要在 SpringBoot Rest API 中记录我的请求的总体执行时间。请求总是进入到MainController
总是可以从两个地方退出——
- 主要
Restcontroller
相同的方法或 ExceptionHandlerController
处理方法
我创建了一个自定义注释并将其注入到主要方法Controller
和ExceptionController
方法中,并获取各个方法的经过时间。所以这就是问题所在。我需要添加这些单独的时间来计算我不想要的总时间。
有没有其他方法可以轻松记录此信息。
方面类:
@Aspect
@Component
public class PointsAspect {
private final static Logger logger = LoggerFactory.getLogger(PointsAspect.class);
@Around("@annotation(annotation)")
public Object logMethod(final ProceedingJoinPoint proceedingJoinPoint, final LogAround annotation)
throws Throwable {
final long start = System.currentTimeMillis();
Object obj;
try {
logger.debug("Starting...! Method Name - " +proceedingJoinPoint.getSignature().getName());
obj = proceedingJoinPoint.proceed();
} finally {
logger.debug("Exiting...! Method Name - " +proceedingJoinPoint.getSignature().getName() +"Execution Time in Milliseconds:> "+ String.valueOf(System.currentTimeMillis()-start));
}
return obj;
}
}
标记接口:
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface LogAround {
}
这就是我注入它的方式:
**ExceptionHandlerController.java**
@LogAround
@ExceptionHandler(HttpMessageNotReadableException.class)
public GenericFailureResponse missingRequestBodyException(HttpServletResponse response,
HttpServletRequest request, Exception ex) throws IOException {
GenericFailureResponse failureResponse = new GenericFailureResponse();
//TODO: exception logic
return failureResponse;
}
**MainController.java**
@LogAround
public String getTotalPoints(@RequestParam(required=true) long memberNo,
HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) {
//TODO : some logic
return "something";
}
解决方案
您可以使用简单的过滤器。
@Component
public class LogTimeFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
long startTime = System.currentTimeMillis();
chain.doFilter(request, response);
long duration = System.currentTimeMillis() - startTime;
System.out.println("Request take " + duration + " ms");
}
}
推荐阅读
- python - Speeding up agg on large pandas table
- nginx - Does nginx bytes_sent and request_length variables include tcp and tls headers?
- reactjs - How to edit a todo in a todo list without hooks and redux
- python - ValueError:要求检索元素 0,但序列的长度为 0
- javascript - 自定义 React 组件库中的子模块
- c# - ASP.Net Core MVC DisplayFormat 不删除日期的时间元素
- r - 如何将字符串列分成多列?
- javascript - 我的导航栏/标题有问题,它曾经可以工作,但现在不行
- java - 为什么 IntelliJ IDEA 不允许在这里正确缩进?
- python - 如何从相同的元素中随机选择索引