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

java logbook_SpringBoot使用Logbook记录HTTP请求响应日志SpringBoot的httptrace端口能够记录每次访问的请求和响应信息,但是不能记录body,这样在出问题时就不方便排查,而且httptrace不方便在原有的基础上进行扩展,所以只能寻求其他方式进行记录。Logbook是一个可扩展的Java库,可以为不同的客户端和服务端技术提供完整的请求和响应日志记录。它能够满足一些特殊的需求:允许web应用记录程序接收或发送的所有HTTP通信易于保留和进…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

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的支持,具体使用方法可以参考官方文档。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/203547.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • PyCharm创建一个新的项目

    PyCharm创建一个新的项目欢迎使用PyCharm这是第一次使用PyCharm,如果你想学习如何使用PyCharm创建一个新的项目,可以仔细阅读这篇文章,了解一下。打开PyCharm点击创建一个新项目选择保存的目录(建议D盘),刚刚安装的默认选择新建环境,点击创建下载配置解释器Python3.8进行中开始创建以“.py”为后缀写个简单的helloworld!运行一下结果如下可以用一个子目录打包需要写的东西同样的操作这次写个learnPython,看看效果,前后对比还有文件存储

  • idea2016 3.2激活码破解方法

    idea2016 3.2激活码破解方法,https://javaforall.cn/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

  • linux tar 绝对路径,tar打包使用绝对路径详解

    linux tar 绝对路径,tar打包使用绝对路径详解首先应该明确:*nix系统中,使用tar对文件打包时,一般不建议使用绝对路径。通常是在两台环境相似的机器上进行同步复制的时候,才有需要使用绝对路径进行打包。使用绝对路径打包时如果不指定相应的参数,tar会产生一句警告信息:”tar:Removingleading`/’frommembernames”,并且实际产生的压缩包会将绝对路径转化为相对路径。比如:root@queen~#t…

  • 话说软件详细设计工具[通俗易懂]

    在软件设计是需要写软件详细说明书,设计此文档的时候,肯定少不了工具.现在我们就来了解一下软件详细设计的工具.1)程序流程图         程序流程图又称为程序框图,它是最古老,应用最广泛且最有争议描述详细设计的工具.它易学,表达算法直观,缺点是不够规范,特别是使用箭头会使质量受到很大的影响.为了使它能够描述结构化的程序,限制只能用

  • ORACLE控制处理函数COALESCE()和NVL()

    ORACLE控制处理函数COALESCE()和NVL()1.语法COALESCE(expression,value1,value2……,valuen)2.说明主流数据库系统都支持COALESCE()函数,这个函数主要用来进行空值处理,其参数格式如下:COALESCE(expression,value1,value2……,valuen)COALESCE()函数的第一个参数expression为待检测的表达式,而其后的参数个数不定。COALESCE()函数将会返回包括expression在内的所有参数中的第一个非空表达式。

  • mongoshake实现mongodb数据同步

    mongoshake实现mongodb数据同步mongoshake实现mongodb数据同步

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号