spring-boot - 跟踪 Spring Boot 应用程序中的所有请求

标签 spring-boot interceptor

我们使用 Spring Boot 来编写 RESTFul Web 服务。我们的应用程序中有大量的 Web 服务。新的要求现在就在这里。我的老板要求我跟踪每个服务请求。 例如:如果调用登录服务,则必须通过计数、响应状态和更多详细信息对其进行跟踪。有没有办法做到这一点。诸如拦截器之类的东西将在服务处理之后和响应提供之前被调用。

最佳答案

Spring Boot 支持 servlet 过滤器,并允许您以与任何 @Component 相同的方式注册它们。(通过使用 @Component 注释类并将其放置在 Spring Boot 将自动配置该类的包中)

使用 (ServletRequest req, ServletResponse res) 对象检索您需要的数据。

package application.basepackage.maybeafilterspecificpackage;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;

@Component
public class SimpleLoggingFilter implements Filter {
    private final Logger logger = LoggerFactory.getLogger(SimpleLoggingFilter .class);

    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse) res;
        HttpServletRequest request = (HttpServletRequest) req;
        String url = request.getServletPath();
        logger.info(url + " - " + request.getMethod());
        chain.doFilter(req, res);
        logger.info(url + " - " + response.getStatus());
    }

    public void init(FilterConfig filterConfig) {}

    public void destroy() {}

}

我创建了一个映射到/test 的 @RequestMapping,它只是在下面返回一个字符串,我清理了日志以使其更具可读性。

这是我第一次让该方法抛出异常

/test - GET
/test - 500
/favicon.ico - GET
/favicon.ico - 200

然后我将其修复为仅返回一个字符串

/test - GET
/test - 200
/favicon.ico - GET
/favicon.ico - 200

您说得好像您需要对日志有更多的控制权,但如果您使用嵌入式 Tomcat,则有一个更简单的替代方案。

Spring Boot enable http requests logging

关于spring-boot - 跟踪 Spring Boot 应用程序中的所有请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33472400/

相关文章:

java - Jackson 不会将新的 JSON 对象附加到现有的 Json 文件中

java - Spring boot 不接收从 Angular 客户端添加的请求 header

java - encodeRedirectURL 改变了一些字符

javascript - TypeError:无法使用拦截器读取 Angular 中未定义的属性 'data'

java - 在 Spring Boot 中实例化的类中的 Autowiring 存储库

java - "com.fasterxml.jackson.databind.JsonMappingException: Expected type float, integer, or string."使用 ObjectMapper 转换 java.time.Instant

java - Apache CXF LoggingInInterceptor 已弃用 - 改用什么?

java - 无法 Autowiring 字段 : private org. springframework.security.authentication.AuthenticationManager

spring - 在Spring的哪里,如何在Spring Boot中解决 “java.lang.NoClassDefFoundError: org/springframework/data/mapping/context/MappingContext”?