我正在使用 Spring Boot 编写 Web Rest Web 服务。
我想记录我的网络服务处理请求所花费的时间。我还想记录标头、方法和调用的 URI。
几个月前我在我的球衣网络服务中做了类似的事情 ContainerRequestFilter and ContainerResponseFilter filter() method.
另外,AOP 是更好还是过滤器?
原文由 VeKe 发布,翻译遵循 CC BY-SA 4.0 许可协议
我正在使用 Spring Boot 编写 Web Rest Web 服务。
我想记录我的网络服务处理请求所花费的时间。我还想记录标头、方法和调用的 URI。
几个月前我在我的球衣网络服务中做了类似的事情 ContainerRequestFilter and ContainerResponseFilter filter() method.
另外,AOP 是更好还是过滤器?
原文由 VeKe 发布,翻译遵循 CC BY-SA 4.0 许可协议
Spring Boot:日志记录拦截器
public class ApiLogger extends HandlerInterceptorAdapter {
private static final Logger logger = LoggerFactory
.getLogger(ApiLogger.class);
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String requestId = UUID.randomUUID().toString();
log(request,response, requestId);
long startTime = System.currentTimeMillis();
request.setAttribute("startTime", startTime);
request.setAttribute("requestId", requestId);
return true;
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
super.afterCompletion(request, response, handler, ex);
long startTime = (Long)request.getAttribute("startTime");
long endTime = System.currentTimeMillis();
long executeTime = endTime - startTime;
logger.info("requestId {}, Handle :{} , request take time: {}",request.getAttribute("requestId"), handler, executeTime);
}
private void log(HttpServletRequest request, HttpServletResponse response, String requestId) {
logger.info("requestId {}, host {} HttpMethod: {}, URI : {}",requestId, request.getHeader("host"),
request.getMethod(), request.getRequestURI() );
}
}
注册拦截器:
@Configuration
@EnableWebMvc
public class AppConfig extends WebMvcConfigurerAdapter {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new ApiLogger()).addPathPatterns("/api/v1/*");
}
}
原文由 Bhushan Uniyal 发布,翻译遵循 CC BY-SA 4.0 许可协议
15 回答8.4k 阅读
8 回答6.2k 阅读
1 回答4k 阅读✓ 已解决
3 回答6k 阅读
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
您是否尝试过这样的基本过滤器?
编辑:(感谢@suren-aznauryan)现在,它使用
Instant
和Duration
并避免System.currentTimeMillis()
-c7fed.2b-