java logbook_SpringBoot使用Logbook记录HTTP请求响应日志
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请求响应日志相关推荐
- SpringBoot使用Logbook记录HTTP请求响应日志
写在前面:2020年面试必备的Java后端进阶面试题总结了一份复习指南在Github上,内容详细,图文并茂,有需要学习的朋友可以Star一下! GitHub地址:https://github.com/ ...
- nginx log记录请求响应日志及日志分割
之前部署了quic的集群在aws,在测试的时候发现在大报文的情形下HTTP3的请求耗时比较不稳定,并且耗时比普通的HTTP2要大很多,就想看看请求的具体耗时有多少 请求响应日志记录 我的quic集群是 ...
- 微服务分布式架构中,如何高效收集请求/响应日志
本文主要讲述了spring cloud微服务使用Feign作为微服务间的通讯框架的情况下,如何配置统一的日志打印,能更直观地在日志中收集有效信息. (以下只提供了核心代码截图,详细代码可通过githu ...
- 使用java解析Infor XA ERP SystemLink请求响应报文
Infor XA ERP的SystemLink响应报文是一段比较复杂的xml,里面记录了操作是否成功的状态以及操作结果或者错误说明. 对SystemLink解析,就是从响应的xml报文里面解析出操作结 ...
- Java网络爬虫学习记录(请求基础篇)
目录 个人实验遇见错误集: 一.javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX ...
- 优雅地记录http请求和响应的数据
点击关注公众号,Java干货及时送达 来源:https://fredal.xin/http-body-recorder 经常会遇到需要处理 http 请求以及响应 body 的场景. 而这里比较大的一 ...
- java 请求响应_java http接口请求响应 request response
接口类: 1 package org.sunshine.dcda.epg.wechat.controller.niao; 2 3 import javax.servlet.http.HttpServl ...
- Java代码 httpClient请求 响应 爬虫
public class httpClientStuParam06Test {@Testpublic void getParam() throws URISyntaxException {System ...
- ASP.NET Web API 记录请求响应数据到日志的一个方法
原文:ASP.NET Web API 记录请求响应数据到日志的一个方法 原文:http://blog.bossma.cn/dotnet/asp-net-web-api-log-request-resp ...
最新文章
- 子分类账知识学习(汇总网上比较有用的资料)
- PHP 给图片制作水印的方法
- Python 黑魔法 --- 描述器(descriptor)
- C#期中考试题人事系统篇
- POJ 2411 Mondriaan's Dream
- 【Java从入门到头秃专栏 】(二) 注释 数据类型 变量 常量 关键字 标识符 运算符 输入输出
- Java的内存模型,java初级面试笔试题
- 关于MATLAB处理大数据坐标文件
- django 定制管理页面外观 模板文件不生效的解决方法
- 48. Element isSupported() 方法
- 《21天学通C语言(第7版)》一6.6 课后研习
- java基本数据类型字节大小,Java基本数据类型及所占字节大小
- 我如何学会欣赏求职者
- 【bsauce读论文】 Playing for K(H)eaps: Understanding and Improving Linux Kernel Exploit Reliability
- 将 PDF 文件拆分为多个同样页数 pdf 文件的 Windows Powershell 脚本
- 组织要为每一个员工赋能
- 在机器人面前,人类怎样做才能不悲观
- 论文《Face Alignment at 3000 FPS via Regressing Local Binary Features》笔记
- JavaScript 中 OnLoad事件用法总结
- 如果你不了解未来年轻人的生活方式,谈什么立业!
热门文章
- SCEA PART I 考试心得
- 小程序自定义组件仿微信联系人可导航字母序排列数据列表
- Spring框架——AOP入门笔记以及个人总结
- matching书页匹配例子
- 整理 fsockopen 请求实现方式
- java 打印图形 (* 各种图形)
- 国开电大计算机应用基础(本)形考任务一,国开电大计算机应用基础(本)形考任务三答案...
- Word控件Spire.Doc 【Table】教程(17):如何在 C#、VB.NET 中删除 Word 表格中的行和列
- 深度学习目标检测:YOLOv5实现红绿灯检测(含红绿灯数据集+训练代码)
- 新AI时代序幕已拉开 不信请看这十四大例