有些业务需求需要跟踪我们的接口访问,即记录请求和响应。基本记录维度包括请求入参(路径查询参数、请求体)、请求路径(uri)、请求方法(method)、请求头(headers)、响应状态、响应头,甚至敏感的响应体等等。.今天总结了几种方法,大家可以根据自己的需要选择。请求跟踪的实现方法网关层很多网关设施都有httptrace的功能,可以帮助我们集中记录请求流量。Orange、Kong、ApacheApisix等基于Nginx的网关都具备这种能力,甚至Nginx本身也提供了记录httptrace日志的能力。优点是httptrace日志可以集中管理,免开发;缺点是技术要求高,需要分发、存储、查询等配套设施。SpringBootActuator其实在SpringBoot中提供了一个简单的跟踪功能。你只需要整合::exposure:include:'httptrace',可以通过http://server:port/actuator/httptrace获取最新的Http请求信息。但在最新版本中,可能需要显式声明这些跟踪信息的存储方式,即实现HttpTraceRepository接口,注入SpringIoC。例如,将其放入内存并将其限制为最近的100个条目(不建议用于生产用途):@BeanpublicHttpTraceRepositoryhttpTraceRepository(){returnnewInMemoryHttpTraceRepository();}Tracelogs以json格式呈现:记录不多,当然如果够用的话可以试试。优点是易于集成,几乎免开发;缺点是记录的维度不多,需要搭建缓冲和消费这些日志信息的设施。CommonsRequestLoggingFilterSpringWeb模块还提供了一个过滤器CommonsRequestLoggingFilter,它可以记录请求的细节。配置也比较简单:@BeanCommonsRequestLoggingFilterloggingFilter(){CommonsRequestLoggingFilterloggingFilter=newCommonsRequestLoggingFilter();//记录客户端IP信息loggingFilter.setIncludeClientInfo(true);//记录请求头loggingFilter.setIncludeHeaders(true);//如果logging为请求头,可以指定哪些记录,哪些不记录//loggingFilter.setHeaderPredicate();//记录请求体,特别是POST请求的body参数loggingFilter.setIncludePayload(true);//请求体的大小限制默认为50loggingFilter.setMaxPayloadLength(10000);//记录请求路径中的查询参数loggingFilter.setIncludeQueryString(true);returnloggingFilter;}并且必须打开CommonsRequestLoggingFilter的调试日志:logging:level:org:springframework:web:filter:CommonsRequestLoggingFilter:debugonce请求会输出两次日志,一次在第一次通过过滤器之前;完成过滤器链后一次。这里多说一句,其实可以转化为输出json格式。优点是配置灵活,请求跟踪维度全面。缺点是只记录请求,不记录响应。ResponseBodyAdviceSpringBoot统一返回体其实是可以记录的,需要自己实现。这里借用了CommonsRequestLoggingFilter的方法来解析请求。响应体也可以获取,但是由于生命周期的关系,响应头和状态不明确,所以不清楚这里获取是否合适,但这是一个思路。/***@authorfelord.cn*@since1.0.8.RELEASE*/@Slf4j@RestControllerAdvice(basePackages={"cn.felord.logging"})publicclassRestBodyAdviceimplementsResponseBodyAdvice