Springboot 使用 CommonsRequestLoggingFilter 记录接口访问日志

本文由 简悦 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

输出如下:

1
/get?p1=p1&p2=12345

setIncludePayload

1
2
loggingFilter.setIncludePayload(true);
loggingFilter.setMaxPayloadLength(2000);

设置是否打印 request body,默认值为 false,setMaxPayloadLength 用于设置打印的长度,默认为 50,即只打印前 50 个字符,可根据实际项目需要进行调整。

输出如下:

1
payload={"name": "张三"}

其他配置

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