写在前面:2020年面试必备的Java后端进阶面试题总结了一份复习指南在Github上,内容详细,图文并茂,有需要学习的朋友可以Star一下!
GitHub地址:https://github.com/abel-max/Java-Study-Note/tree/master

Spring Boot的httptrace端口能够记录每次访问的请求和响应信息,但是不能记录body,这样在出问题时就不方便排查,而且httptrace不方便在原有的基础上进行扩展,所以只能寻求其他方式进行记录。

Logbook是一个可扩展的Java库,可以为不同的客户端和服务端技术提供完整的请求和响应日志记录。它能够满足一些特殊的需求:

  • 允许web应用记录程序接收或发送的所有HTTP通信
  • 易于保留和进行分析

Logbook在大部分情况下是开箱即用的,即使对于一些不常用的技术或者应用,实现它们也非常简单。

特性
日志记录:HTTP请求和响应,包含body;未授权的请求会记录部分日志(不包含body)
自定义:能够自定义记录格式、记录方式以及请求记录的条件
支持框架:Servlet容器,Apache’s HTTP client,Square’s OkHttp等
混淆敏感数据
Spring Boot自动配置
合理的默认值
快速开始
Logbook为Spring Boot用户提供了很方便的自动配置功能,即我们所熟悉的 starter 。它使用了合理的默认值自动配置了以下功能:

Servlet filter
适用于未授权请求的Servlet filter(如果检测到项目中使用Spring Security)
Header过滤器、Parameter过滤器、Body过滤器
HTTP格式化器、JSON格式化器
日志写入方式
引入 starter 模块:

默认配置下,输出的日志为JSON格式:

Request
Response
配置
下面的表格展示了可配置的选项:

配置示例
详细用法
所有的功能集成都需要一个 Logbook 实例来完成,它保存了所有的配置并将所有需要的组件连接在一起。你可以使用所有的默认值创建一个实例:

或者使用 LogbookBuilder 创建一个自定义的版本:

在使用 starter 时,我们只需要自定义相应的 Bean 即可。

策略
Logbook使用一个非常硬性的策略来执行请求/响应日志记录:

请求/响应分开记录
请求/响应尽快记录
请求/响应一起记录或不记录
从2.0版本开始,Logbook引入了一个新的策略模式为核心,它内置了部分策略:

BodyOnlyIfStatusAtLeastStrategy
StatusAtLeastStrategy
WithoutBodyStrategy
阶段
Logbook工作在几个不同的阶段:

条件
过滤
格式化
记录
每个阶段都由一个或多个可以自定义的接口完成。每个阶段都有一个合理的默认值。

条件
记录HTTP消息并且包含其body的代价是非常大的,所以禁用某些请求的日志记录非常有意义。一个常见的情景就是忽略一些不必要的请求,比如Spring Boot的Actuator端点。

定义一个条件非常简单,只需要编写一个 Predicate 来决定请求是否需要记录。当然,你也可以组合预定义的 Predicate :

对与路径的包含和排除也可以通过设置 logbook.include 和 logbook.exclude 属性实现。

过滤
过滤的目的是防止记录HTTP请求和响应的某些敏感数据。这通常包括Authorization请求头,但也可以用于某些明文查询或表单参数,例如access_token和password。

Logbook支持不同类型的过滤器:

SpringBoot使用Logbook记录HTTP请求响应日志
QueryFilter , PathFilter , HeaderFilter 和 BodyFilter 能够满足绝大多数情况下的需求,对于更复杂的需求,可以使用 RequestFilter 和 ResponseFilter 。

关联
Logbook使用一个id来关联请求和响应,因为请求和响应通常位于日志文件中的不同位置。

在Spring Cloud应用中一般会集成Zipkin进行链路追踪,此时可以使用TraceId来关联请求和响应日志记录。

如果默认实现不满足你的需求,你可以提供一个自定义的实现:

格式化
格式化定义了如何把请求和响应转换为字符串的方式。格式化不会指定请求和响应的记录位置,这是由writer来完成的。

Writer
Writer定义了格式化后的请求和响应写入的位置。Logbook内置了三种实现:Logger,Stream和Chunking。

Logger
默认情况下,请求和响应使用了slf4j来进行日志记录,日志的级别为 trace 。你也可以自定义:

Stream
另一种实现方式是记录请求和响应到 PrintStream ,例如 System.out 或 System.err 。在生产环境中这是一个糟糕的选择,但有时对于短暂的本地开发和调试很有用。

Chunking
ChunkingSink 会把长的消息分割成较小的块,并且会委托给另一个sink将它们写入,只需要设置 logbook.write.chunk-size 属性即可。

Sink
HttpLogFormatter 和 HttpLogWriter 的组合能够适用于大部分场合,但是也有一些局限性。实现 Sink 接口可以实现更复杂的需求,例如把请求和响应持久化到数据库。

你可以使用 CompositeSink 将多个Sink合并为一个。

Servlet
在Servlet环境中,Logbook是通过 LogbookFilter 来实现的。默认情况下,对于
application/x-www-form-urlencoded 请求会同等对待,即你会在日志中看到请求body。这种方法的缺点是下游代码将无法使用任何
HttpServletRequest.getParameter*(…) 方法。

从Logbook 1.5.0开始,可以使用
logbook.servlet.form-request 系统属性(System Property)指定三种策略之一,这些策略定义Logbook如何处理这种情况:


其他框架支持
Logbook默认还提供了对HTTP Client、JAX-RS、Netty、OkHttp v2.x、OkHttp v3.x的支持,具体使用方法可以参考官方文档。

SpringBoot使用Logbook记录HTTP请求响应日志相关推荐

  1. java logbook_SpringBoot使用Logbook记录HTTP请求响应日志

    Spring Boot的httptrace端口能够记录每次访问的请求和响应信息,但是不能记录body,这样在出问题时就不方便排查,而且httptrace不方便在原有的基础上进行扩展,所以只能寻求其他方 ...

  2. nginx log记录请求响应日志及日志分割

    之前部署了quic的集群在aws,在测试的时候发现在大报文的情形下HTTP3的请求耗时比较不稳定,并且耗时比普通的HTTP2要大很多,就想看看请求的具体耗时有多少 请求响应日志记录 我的quic集群是 ...

  3. 微服务分布式架构中,如何高效收集请求/响应日志

    本文主要讲述了spring cloud微服务使用Feign作为微服务间的通讯框架的情况下,如何配置统一的日志打印,能更直观地在日志中收集有效信息. (以下只提供了核心代码截图,详细代码可通过githu ...

  4. 【开发技巧】-- SpringBoot使用LogBook打印http请求、响应信息

    1. 什么是logbook? logbook是一个用于打印http请求信息的一个开源组件. 2. 如何使用logbook? [这里以SpringBoot项目为例] 导入logbook相关maven依赖 ...

  5. SpringBoot切面AOP打印请求和响应日志

    1.说明 Spring Boot微服务对外开放的Restful接口, 为了方便定位问题, 一般需要记录请求日志和响应日志, 而在每个接口中开发日志代码是非常繁琐的, 本文介绍使用Spring的切面AO ...

  6. ASP.NET Web API 记录请求响应数据到日志的一个方法

    原文:ASP.NET Web API 记录请求响应数据到日志的一个方法 原文:http://blog.bossma.cn/dotnet/asp-net-web-api-log-request-resp ...

  7. SpringBoot AOP 记录WEB请求日志

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/catoop/article/details/71556374 接上一篇文章: http://blog ...

  8. Tomcat日志记录post请求参数

    公司的项目向用户提供接口,但是最近偶尔会出现超时的情况,用户的调用设置的超时时间是1分钟,所以首先要排查代码的执行时间是否超过一分钟 @PostMapping("/updateattachm ...

  9. nginx post请求超时_nginx记录分析网站响应慢的请求(ngx_http_log_request_speed)

    nginx模块ngx_http_log_request_speed可以用来找出网站哪些请求很慢,针对站点很多,文件以及请求很多想找出哪些请求比较慢的话,这个插件非常有效.作者的初衷是写给自己用的,用来 ...

最新文章

  1. VM页面中遍历枚举类
  2. python执行命令并返回结果集_Python接口测试结果集实现封装比较
  3. OSPF——优化技术(含配置)
  4. d3 canvas_D3和Canvas分3个步骤
  5. SMI/慧荣/SM32**主控量产通用教程,PNY U盘量产!
  6. CUDA、MPI和SU混编,MakeFile文件的编写
  7. python监控机器(第1版)
  8. python有趣小程序-python好玩的小程序
  9. hello bokeyuan
  10. LigerUI之Grid使用详解(三)——字典数据展示
  11. 食堂报餐点餐公司订餐微信小程序源码开发使用
  12. 现代JS名词概念系列——函数的纯洁性【龟速翻译】
  13. 88E1111 100BASE-T百兆工程(part1)
  14. Android第三方SDK集成 —— 极光推送
  15. 按键触发快捷怼人小工具(怼人必备良药)
  16. 对qq空间动手--selenium实践
  17. excel中如何在一列数据的前面统一加上一个符号
  18. Raptor-数字分解
  19. 外汇券商TFS-ICAP因误导客户并使用虚假报告被FCA处罚340万英镑
  20. 特征提取网络之Darknet

热门文章

  1. DBC文件的编辑方法
  2. 【小迪实地】Webdav安全配置相关与漏洞利用
  3. [PATCH] ARM: add dtbImage.dt and dtbuImage.dt rules
  4. linux 搭建免费企业邮箱
  5. MFC CToolBar使用总结
  6. 【知识点】信道路径衰落分类、计算公式、换算
  7. 记-阿里开发手册规范(JAVA)
  8. 【方法实践】军工企业智能物流系统研究
  9. 多项式与快速傅立叶变换
  10. JOL:查看Java 对象布局、大小工具