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.include

仅包含某些URL(如果设置的话)

[]

logbook.exclude

排除某些URL(会覆盖

logbook.include

)

[]

logbook.filter.enabled

是否启用

LogbookFilter

true

logbook.filter.form-request-mode

如何处理表单请求

body

logbook.secure-filter.enabled

是否启用

SecureLogbookFilter

(同时项目中使用Spring Security才会生效)

true

logbook.format.style

格式化样式(

http

json

curl

splunk

)

json

logbook.strategy

策略(

default

status-at-least

body-only-if-status-at-least

without-body

)

default

logbook.minimum-status

启用日志记录的最小HTTP响应状态值,当策略值为

status-at-least

或者

body-only-if-status-at-least

时设置

400

logbook.obfuscate.headers

需要混淆的HTTP Header集合

[Authorization]

logbook.obfuscate.paths

需要混淆的path集合

[]

logbook.obfuscate.parameters

需要混淆的parameter集合

[access_token]

logbook.write.chunk-size

日志拆分块的大小,默认不拆分

0

(禁用)

logbook.write.max-body-size

截取Body的最大长度,后面使用

...

拼接

-1

(禁用)

配置示例

详细用法

所有的功能集成都需要一个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支持不同类型的过滤器:

类型

作用于

适用于

默认值

QueryFilter

请求参数

request

access_token

PathFilter

路径

request

HeaderFilter

请求头

request/response

Authorization

BodyFilter

Content-Type and body

request/response

json格式:

access_token

refresh_token

,form表单:

client_secret

password

RequestFilter

HttpRequest

request

替换二进制、文件上传和流

ResponseFilter

HttpResponse

response

替换二进制、文件上传和流

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如何处理这种情况:

属性值

优点

缺点

body

(默认)

body会被记录

下游代码不能使用

getParameter*()

parameter

body会被记录

下游代码不能使用

getInputStream()

off

下游代码可以使用

getParameter*()

或者

getInputStream()

body不会被记录

其他框架支持

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

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

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

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

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

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

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

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

  4. 使用java解析Infor XA ERP SystemLink请求响应报文

    Infor XA ERP的SystemLink响应报文是一段比较复杂的xml,里面记录了操作是否成功的状态以及操作结果或者错误说明. 对SystemLink解析,就是从响应的xml报文里面解析出操作结 ...

  5. Java网络爬虫学习记录(请求基础篇)

    目录 个人实验遇见错误集: 一.javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX ...

  6. 优雅地记录http请求和响应的数据

    点击关注公众号,Java干货及时送达 来源:https://fredal.xin/http-body-recorder 经常会遇到需要处理 http 请求以及响应 body 的场景. 而这里比较大的一 ...

  7. java 请求响应_java http接口请求响应 request response

    接口类: 1 package org.sunshine.dcda.epg.wechat.controller.niao; 2 3 import javax.servlet.http.HttpServl ...

  8. Java代码 httpClient请求 响应 爬虫

    public class httpClientStuParam06Test {@Testpublic void getParam() throws URISyntaxException {System ...

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

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

最新文章

  1. 子分类账知识学习(汇总网上比较有用的资料)
  2. PHP 给图片制作水印的方法
  3. Python 黑魔法 --- 描述器(descriptor)
  4. C#期中考试题人事系统篇
  5. POJ 2411 Mondriaan's Dream
  6. 【Java从入门到头秃专栏 】(二) 注释 数据类型 变量 常量 关键字 标识符 运算符 输入输出
  7. Java的内存模型,java初级面试笔试题
  8. 关于MATLAB处理大数据坐标文件
  9. django 定制管理页面外观 模板文件不生效的解决方法
  10. 48. Element isSupported() 方法
  11. 《21天学通C语言(第7版)》一6.6 课后研习
  12. java基本数据类型字节大小,Java基本数据类型及所占字节大小
  13. 我如何学会欣赏求职者
  14. 【bsauce读论文】 Playing for K(H)eaps: Understanding and Improving Linux Kernel Exploit Reliability
  15. 将 PDF 文件拆分为多个同样页数 pdf 文件的 Windows Powershell 脚本
  16. 组织要为每一个员工赋能
  17. 在机器人面前,人类怎样做才能不悲观
  18. 论文《Face Alignment at 3000 FPS via Regressing Local Binary Features》笔记
  19. JavaScript 中 OnLoad事件用法总结
  20. 如果你不了解未来年轻人的生活方式,谈什么立业!

热门文章

  1. SCEA PART I 考试心得
  2. 小程序自定义组件仿微信联系人可导航字母序排列数据列表
  3. Spring框架——AOP入门笔记以及个人总结
  4. matching书页匹配例子
  5. 整理 fsockopen 请求实现方式
  6. java 打印图形 (* 各种图形)
  7. 国开电大计算机应用基础(本)形考任务一,国开电大计算机应用基础(本)形考任务三答案...
  8. Word控件Spire.Doc 【Table】教程(17):如何在 C#、VB.NET 中删除 Word 表格中的行和列
  9. 深度学习目标检测:YOLOv5实现红绿灯检测(含红绿灯数据集+训练代码)
  10. 新AI时代序幕已拉开 不信请看这十四大例