文章目录
日志输出-第三章-接口级出入参输出完整数据的实现
前置内容
一、概述
上一章贴了日志出入参的代码,在第三节的内容中描述了为什么没有输出 body 内容的原因(我个人认为上一章的方案是最优解),本章的教程主要是如何输出 body 中的数据。
正常情况下也是拿来做数据加解密处理之类的
二、如何输出 Request 的 body
这一块的主要问题在于流不可重复读,所以我们通过对 ServletRequest
进行包装的方式,来达到重复读取流的效果。
但是弊端也会很明显,body
的数据会被拷贝多份,一方面内存压力会增大,另一方面性能损耗也不小,所以一般在日志中很少会输出 Request
中 body
的数据。
2.1、工具类
package com.lzl.study.scaffold.studyscaffold.common.log;
import lombok.extern.slf4j.Slf4j;
import javax.servlet.http.HttpServletRequest;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
/**
* @ClassName RequestResponseUtil
* @Author lizelin
* @Description request、response 工具类
* @Date 2024/5/27 18:26
* @Version 1.0
*/
@Slf4j
public abstract class RequestResponseUtil {
/**
* @Param request
* @Return java.lang.String
* @Description 获取 Request 中 Body
* @Author lizelin
* @Date 2023/11/3 16:08
**/
public static String getRequestBody(HttpServletRequest request) {
StringBuilder stringBuilder = new StringBuilder();
BufferedReader bufferedReader = null;
InputStream inputStream = null;
InputStreamReader inputStreamReader = null;
try {
inputStream = request.getInputStream();
if (inputStream != null) {
inputStreamReader = new InputStreamReader(inputStream);
bufferedReader = new BufferedReader(inputStreamReader);
char[] charBuffer = new char[128];
int bytesRead;
while ((bytesRead = bufferedReader.read(charBuffer)) > 0) {
stringBuilder.append(charBuffer, 0, bytesRead);
}
}
} catch (IOException e) {
log.error("读取流失败:",e);
} finally {
close(bufferedReader, inputStream,inputStreamReader);
}
return stringBuilder.toString();
}
/**
* @Param bufferedReader
* @Param inputStream
* @Return void
* @Description 关闭流
* @Author lizelin
* @Date 2023/11/3 16:08
**/
private static void close(BufferedReader bufferedReader, InputStream inputStream,InputStreamReader inputStreamReader) {
try {
if (inputStream != null) {
inputStream.close();
}
if (bufferedReader != null) {
bufferedReader.close();
}
if (inputStreamReader != null){
inputStreamReader.close();
}
} catch (IOException e) {
log.info("流关闭失败", e);
}
}
}
2.2、包装类
package com.lzl.study.scaffold.studyscaffold.common.log;
import cn.hutool.core.collection.CollUtil;
import org