本文由 简悦 SimpRead 转码, 原文地址 www.icode9.com
项目中通常有记录请求日志的需求,可以通过 AOP、Filter 来实现,而 Springweb 也提供了 CommonsRequestLoggingFilter 来进行简单的请求日志记录,下面来使用 CommonsR……
2021-05-09 19:02:16 阅读:363
**标签:**CommonsRequestLoggingFilter p1 Springboot request loggingFilter 日志 true
项目中通常有记录请求日志的需求,可以通过 AOP、Filter 来实现,而 Spring web 也提供了 CommonsRequestLoggingFilter 来进行简单的请求日志记录,下面来使用 CommonsRequestLoggingFilter 进行请求日志记录
先来编写一个测试用的 Controller:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import java.util.Map;
@RestController
public class TestController {
@GetMapping("get")
public Map<String, Object> testGet(String p1, Integer p2) {
return Map.of("p1", p1, "p2", p2);
}
@PostMapping("post")
public Map<String, Object> testGet(@RequestBody Map<String, Object> map) {
return map;
}
}
|
编写配置 创建 CommonsRequestLoggingFilter
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.filter.CommonsRequestLoggingFilter;
@Configuration
public class AppConfig {
@Bean
public CommonsRequestLoggingFilter requestLoggingFilter() {
CommonsRequestLoggingFilter loggingFilter = new CommonsRequestLoggingFilter();
loggingFilter.setIncludeHeaders(true);
loggingFilter.setIncludeClientInfo(true);
loggingFilter.setIncludeQueryString(true);
loggingFilter.setIncludePayload(true);
loggingFilter.setMaxPayloadLength(2000);
return loggingFilter;
}
}
|
现在访问接口还不会有日志输出,从 CommonsRequestLoggingFilter 的源码可以看出,日志是在 debug 级别下输出,所以需要配置 CommonsRequestLoggingFilter 的日志级别。
在 application.properties 中添加:
1
|
logging.level.org.springframework.web.filter.CommonsRequestLoggingFilter=debug
|
现在访问接口,可以看到有下面信息输出:
1
2
|
Before request [GET /get?p1=p1&p2=12345, client=0:0:0:0:0:0:0:1, headers=[...]]
After request [GET /get?p1=p1&p2=12345, client=0:0:0:0:0:0:0:1, headers=[...]]
|
headers 中的内容去掉了,因为内容比较多,放在这里影响观看
在这里就实现了使用 CommonsRequestLoggingFilter 来进行打印请求日志。如果有一些额外的需求(例如需要把打印的信息保存到数据库),可以继承 CommonsRequestLoggingFilter 然后重写其方法来进行一些额外操作。
下面是配置项的详细说明
1
|
loggingFilter.setIncludeHeaders(true);
|
设置打印请求头,默认值为 false,即不打印。
当 setIncludeHeaders 设置为 true 时,还可以通过 setHeaderPredicate 来配置需要打印值的 header,对于不匹配的 header,值都输出 masked
1
2
|
Predicate<String> p = str -> str.equals("user-agent");
loggingFilter.setHeaderPredicate(p);
|
输出如下:
1
|
headers=[user-agent:"PostmanRuntime/7.26.8", accept:"masked", cache-control:"masked", postman-token:"masked", host:"masked", accept-encoding:"masked", connection:"masked"]
|
setIncludeClientInfo
1
|
loggingFilter.setIncludeClientInfo(true);
|
设置打印请求的 ip 地址,SESSIONID,默认值为 false,如果请求没有 session,不会打印 sessionid。
输出如下:
1
|
client=0:0:0:0:0:0:0:1, session=641CCA6182A0368C3C36104D08B21A6E
|
setIncludeQueryString
1
|
loggingFilter.setIncludeQueryString(true);
|
设置打印 URL 上的请求参数,默认值为 false
输出如下:
setIncludePayload
1
2
|
loggingFilter.setIncludePayload(true);
loggingFilter.setMaxPayloadLength(2000);
|
设置是否打印 request body,默认值为 false,setMaxPayloadLength 用于设置打印的长度,默认为 50,即只打印前 50 个字符,可根据实际项目需要进行调整。
输出如下:
其他配置
1
2
3
4
|
loggingFilter.setBeforeMessagePrefix(""); // 设置 before request 日志前缀,默认为:Before request [
loggingFilter.setBeforeMessageSuffix(""); // 设置 before request 日志后缀,默认为:]
loggingFilter.setAfterMessagePrefix(""); // 设置 before request 日志前缀,默认为:After request [
loggingFilter.setAfterMessageSuffix(""); // 设置 after request 日志后缀,默认为:]
|
**标签:**CommonsRequestLoggingFilter,p1,Springboot,request,loggingFilter, 日志,true
来源: https://www.cnblogs.com/zhen-jiao-ren-tou-da/p/14748500.html