本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看<活动链接>
提问:Spring Boot-如何在一个地方记录所有带有异常的请求和响应?
我正在使用Spring Boot开发Rest API。 我需要使用输入参数(使用方法,例如GET,POST等),请求路径,查询字符串,此请求的相应类方法,该操作的响应(成功和错误)记录所有请求。 例如:
成功的请求:
http://example.com/api/users/1
日志应如下所示:
{
HttpStatus: 200,
path: "api/users/1",
method: "GET",
clientIp: "0.0.0.0",
accessToken: "XHGu6as5dajshdgau6i6asdjhgjhg",
method: "UsersController.getUser",
arguments: {
id: 1
},
response: {
user: {
id: 1,
username: "user123",
email: "user123@example.com"
}
},
exceptions: []
}
或有错误的要求:
http://example.com/api/users/9999
日志应该是这样的:
{
HttpStatus: 404,
errorCode: 101,
path: "api/users/9999",
method: "GET",
clientIp: "0.0.0.0",
accessToken: "XHGu6as5dajshdgau6i6asdjhgjhg",
method: "UsersController.getUser",
arguments: {
id: 9999
},
returns: {
},
exceptions: [
{
exception: "UserNotFoundException",
message: "User with id 9999 not found",
exceptionId: "adhaskldjaso98d7324kjh989",
stacktrace: ...................
]
}
我希望“请求/响应”是一个单独的实体,在成功和错误情况下都具有与此实体相关的自定义信息。
Spring最好的做法是使用过滤器?如果是,您能提供具体的例子吗?
我用过@ControllerAdvice和@ExceptionHandler,但是正如我提到的,我需要在一个地方(和一个日志)处理所有成功和错误请求。
回答1:
不要编写任何拦截器,过滤器,组件,方面等,这是一个非常普遍的问题,已经解决了很多次。
Spring Boot有一个称为Actuator的模块,该模块提供了开箱即用的HTTP请求记录。 有一个映射到/ trace(SB1.x)或/ actuator / httptrace(SB2.0 +)的端点,它将向您显示最近的100个HTTP请求。 您可以对其进行自定义以记录每个请求,或写入数据库。
要获取所需的端点,您将需要spring-boot-starter-actuator依赖关系,并且还需要将要查找的端点“白名单”,并可能为其设置或禁用安全性。
另外,此应用程序将在哪里运行? 您会使用PaaS吗? 托管服务提供商(例如Heroku)将请求日志记录作为其服务的一部分,因此您无需进行任何编码。