当前位置: 首页 > 知识库问答 >
问题:

如何记录Spring Boot中Rest web服务所花费的时间?

邓建柏
2023-03-14

我正在使用Spring Boot编写一个web Rest web服务。

共有1个答案

戴化
2023-03-14

你试过像这样的基本过滤器吗?

import java.io.IOException;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

@Component
@WebFilter("/*")
public class StatsFilter implements Filter {

    private static final Logger LOGGER = LoggerFactory.getLogger(StatsFilter.class);

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // empty
    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
        long time = System.currentTimeMillis();
        try {
            chain.doFilter(req, resp);
        } finally {
            time = System.currentTimeMillis() - time;
            LOGGER.trace("{}: {} ms ", ((HttpServletRequest) req).getRequestURI(),  time);
        }
    }

    @Override
    public void destroy() {
        // empty
    }
}

编辑:(谢谢@suren-aznauryan)现在,它使用了instantduration并避免了system.currenttimemillis()

import java.io.IOException;
import java.time.Duration;
import java.time.Instant;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

@Component
@WebFilter("/*")
public class StatsFilter implements Filter {

    private static final Logger LOGGER = LoggerFactory.getLogger(StatsFilter.class);

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // empty
    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
        Instant start = Instant.now();
        try {
            chain.doFilter(req, resp);
        } finally {
            Instant finish = Instant.now();
            long time = Duration.between(start, finish).toMillis();
            LOGGER.trace("{}: {} ms ", ((HttpServletRequest) req).getRequestURI(),  time);
        }
    }

    @Override
    public void destroy() {
        // empty
    }
}
 类似资料:
  • 问题内容: 是否有可能在springframework中记录方法所花费的时间?全部]自动。我的意思是,我不想进入每种方法并编写log.debug(“ ....”); 东西。 问题答案: AOP是您在这里需要的。AOP允许您将代码添加到您的应用程序,而无需修改原始代码。Spring AOP倾向于使用 Proxy 对象来完成此任务。 代理 对象使用装饰器模式包装原始 Target 对象并添加代码。所述

  • 这是配置jetty日志的后续问题。有没有什么属性可以给出请求所花费的时间? 123.4.5.6---[27/Aug/2004:10:16:17 0000]“GET/jetty/tut/XmlConfiguration.html HTTP/1.1”200 76793”http://localhost:8080/jetty/tut/logging.html“Mozilla/5.0(X11;U;Linu

  • 问题内容: 我正在使用Jenkins管道配置Android应用程序构建过程。 在构建的开始和结束时,将消息发送到相关的Slack通道。 Jenkinsfile的相关部分如下所示: 除了上述信息之外,我还想包括构建运行到该消息的时间,该消息通知构建结束。 是否可以在不添加任何外部插件的情况下做到这一点?如果有一个环境变量可以保存此信息,那将是完美的,但我找不到这样的变量。 问题答案: 由于此 jen

  • 问题内容: 我需要获取执行时间(以毫秒为单位)。 当时接受的答案是使用newDate()。getTime()。但是,我们现在都可以同意使用标准performance.now()API更合适。因此,我正在更改对此答案的公认答案。 问题答案: 使用 performance.now(): :需要导入类 使用 console.time: (非标准) (living standard) 注意 : 传递给和方

  • 我必须记录消费者在SpringKafka中花费的时间。由于kafkaListener方法对每条消息都执行,因此在那里放置一个记录器是行不通的。此外,有时一些信息会丢失,而不是被消费者消费掉。我应该把记录器放在哪里,以找出消费者启动后的弹性时间。使用者不会退出或关闭,其轮询将无限期进行

  • 我有一个有 30 条记录的 RDD(键/值对:键是时间戳,值是 JPEG 字节数组), 我正在运行 30 个执行器。我想将此 RDD 重新分区为 30 个分区,以便每个分区获得一条记录并分配给一个执行器。 当我使用 30) 时,它会在 30 个分区中重新分区我的 rdd,但有些分区得到 2 条记录,有些得到 1 条记录,有些没有得到任何记录。 在Spark中,有没有什么方法可以将我的记录平均分配到