日志输出-第三章-接口级出入参输出完整数据的实现

在这里插入图片描述

日志输出-第三章-接口级出入参输出完整数据的实现

前置内容

  1. 日志输出指南
  2. 日志输出-第二章-接口级出入参的实现

一、概述

上一章贴了日志出入参的代码,在第三节的内容中描述了为什么没有输出 body 内容的原因(我个人认为上一章的方案是最优解),本章的教程主要是如何输出 body 中的数据。

正常情况下也是拿来做数据加解密处理之类的

二、如何输出 Request 的 body

这一块的主要问题在于流不可重复读,所以我们通过对 ServletRequest 进行包装的方式,来达到重复读取流的效果。

但是弊端也会很明显,body 的数据会被拷贝多份,一方面内存压力会增大,另一方面性能损耗也不小,所以一般在日志中很少会输出 Requestbody 的数据。

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值