ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-05-09 19:02:16  阅读:530  来源: 互联网

标签:CommonsRequestLoggingFilter p1 Springboot request loggingFilter 日志 true


项目中通常有记录请求日志的需求,可以通过 AOP、Filter来实现,而 Spring web 也提供了 CommonsRequestLoggingFilter 来进行简单的请求日志记录,下面来使用CommonsRequestLoggingFilter进行请求日志记录

先来编写一个测试用的 Controller:

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

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 中添加:

logging.level.org.springframework.web.filter.CommonsRequestLoggingFilter=debug

现在访问接口,可以看到有下面信息输出:

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 然后重写其方法来进行一些额外操作。

下面是配置项的详细说明

setIncludeHeaders

loggingFilter.setIncludeHeaders(true);

设置打印请求头,默认值为 false,即不打印。

当 setIncludeHeaders 设置为true时,还可以通过 setHeaderPredicate 来配置需要打印值的 header,对于不匹配的 header,值都输出 masked

Predicate<String> p = str -> str.equals("user-agent");
loggingFilter.setHeaderPredicate(p);

输出如下:

headers=[user-agent:"PostmanRuntime/7.26.8", accept:"masked", cache-control:"masked", postman-token:"masked", host:"masked", accept-encoding:"masked", connection:"masked"]

setIncludeClientInfo

loggingFilter.setIncludeClientInfo(true);

设置打印请求的 ip 地址,SESSIONID,默认值为 false,如果请求没有 session,不会打印 sessionid。

输出如下:

client=0:0:0:0:0:0:0:1, session=641CCA6182A0368C3C36104D08B21A6E

setIncludeQueryString

loggingFilter.setIncludeQueryString(true);

设置打印URL上的请求参数,默认值为 false

输出如下:

/get?p1=p1&p2=12345

setIncludePayload

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

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

输出如下:

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

其他配置

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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有