一. 为什么要用到这个

用了 spingcloud 之后,很多业务功能都可以做分离,在网关 zuul 层的过滤器除了做一些验证之外,还可以用来打印请求日志。

二.具体做法

  话不多说,直接上代码:

import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.Charset;
import java.util.Map;import javax.servlet.http.HttpServletRequest;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants;
import org.springframework.util.StreamUtils;import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;import net.sf.json.JSONObject;public class PrintRequestLogFilter extends ZuulFilter {private static final Logger LOGGER = LoggerFactory.getLogger(PrintRequestLogFilter.class);@Overridepublic String filterType() {return FilterConstants.POST_TYPE;//要打印返回信息,必须得用"post"}@Overridepublic int filterOrder() {return 0;}@Overridepublic boolean shouldFilter() {return true;}@Overridepublic Object run() {try {RequestContext ctx = RequestContext.getCurrentContext();HttpServletRequest request = ctx.getRequest();InputStream in = request.getInputStream();String reqBbody = StreamUtils.copyToString(in, Charset.forName("UTF-8"));// 打印userId,获取其他用户信息if (reqBbody != null) {JSONObject json = JSONObject.fromObject(reqBbody);Object userId = json.get("userId");if (userId != null) {PrintRequestLogFilter.LOGGER.info("request userId:\t" + userId);}}// 打印请求方法,路径PrintRequestLogFilter.LOGGER.info("request url:\t" + request.getMethod() + "\t" + request.getRequestURL().toString());Map<String, String[]> map = request.getParameterMap();// 打印请求url参数if (map != null) {StringBuilder sb = new StringBuilder();sb.append("request parameters:\t");for (Map.Entry<String, String[]> entry : map.entrySet()) {sb.append("[" + entry.getKey() + "=" + printArray(entry.getValue()) + "]");}PrintRequestLogFilter.LOGGER.info(sb.toString());}// 打印请求json参数if (reqBbody != null) {PrintRequestLogFilter.LOGGER.info("request body:\t" + reqBbody);}// 打印responseInputStream out = ctx.getResponseDataStream();String outBody = StreamUtils.copyToString(out, Charset.forName("UTF-8"));if (outBody != null) {PrintRequestLogFilter.LOGGER.info("response body:\t" + outBody);}ctx.setResponseBody(outBody);//重要!!!} catch (IOException e) {e.printStackTrace();}return null;}String printArray(String[] arr) {StringBuilder sb = new StringBuilder();for (int i = 0; i < arr.length; i++) {sb.append(arr[i]);if (i < arr.length - 1) {sb.append(",");}}return sb.toString();}
}

以上代码可以打印出所有请求的相关重要信息,包含返回。但要注意一点,就是

ctx.setResponseBody(outBody);

在zuulFilter中,用 InputStream out = ctx.getResponseDataStream();  取出response 信息后,如果不把信息 set 回去,会导致返回信息为空.

日志打印如下:

request userId:    1
request url:    POST    http://127.0.0.1:8000/web/pro/get
request parameters:    [uuid=001]
request body:    {"userId":1,"pageNum":0,"pageSize":10}
response body:    {"message":"msg-null","msgCode":"abcd","statusCode":200,"success":true,"data":[],"totalPage":1,"totalSize":2,"pageSize":10,"pageNum":0}

用 zuulFilter 打印请求日志相关推荐

  1. java http打印请求日志_spring打印http接口请求和响应

    在程序日志中打印出接口请求和响应的内容是一个基本的技术需求.如果在每个接口中实现请求响应的日志打印,程序编写会很繁琐,我们可以利用spring提供的机制,集中处理接口请求响应的日志打印. 具体的代码参 ...

  2. SpringBoot切面AOP打印请求和响应日志

    1.说明 Spring Boot微服务对外开放的Restful接口, 为了方便定位问题, 一般需要记录请求日志和响应日志, 而在每个接口中开发日志代码是非常繁琐的, 本文介绍使用Spring的切面AO ...

  3. Spring Boot 2.1之后如何在启动日志中打印请求路径列表

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | 翟永超 来源 | http://blog.di ...

  4. Android 开发之Okhttp网络请求日志打印

    这里写自定义目录标题 Android 开发之Okhttp 网络请求日志打印 OkHTTP网络日志打印 Android 开发之Okhttp 网络请求日志打印 网络请求是开发的日常工作内容之一,网络日志打 ...

  5. java main 方法使用 HttpClients发送请求 不打印debug日志

    记录目的:java main 方法使用HttpClients发送请求不打印debug日志 记录背景: 使用java main方法测试接口响应时间 发现问题: 控制台打印巨多debug日志 解决方法: ...

  6. Retrofit打印网络请求日志

    用过Retrofit的朋友肯定知道使用Retrofit进行网络网络请求非常的方便简洁,但是要打印网络请求的日志还是要自己另想办法.昨天在网上找了一圈,发现要打印日志,大部分的帖子都是引入OkHttp3 ...

  7. 查看LoadRunner脚本请求日志和服务器返回值方法

    1.  查看所有请求日志和请求响应信息: 采用LoadRunner工具Run-time settings或按键盘F4,选择LOG设置,选择Extended log->Data returned ...

  8. 使用 monitor 命令查看 redis 请求日志

    monitor日志要实时拿 redis 是一个高性能.使用方便的非关系型数据库,我们在使用 redis 时,基本只需要关注存数据,取数据的功能,即 set,get,非常适合用作缓存服务器,降低后端数据 ...

  9. 实现打印异常日志_老生常谈SpringAop日志收集与处理做的工具包

    场景 : 使用Spring Aop拦截参数日志目前大部分做法都基本上大同小异,不想日后每个项目工程都写一份这样的Aop拦截处理日志的代码,甚至代码侵入. 我想知道一些相对重要的请求方法的请求参数,响应 ...

最新文章

  1. 自动驾驶系统关系与自动泊车原理
  2. 取代人类医生?AI给你做的诊断你敢信吗
  3. java byte 正数最大_为什么Java byte 类型的取值范围是-128~127
  4. 会计——会计核算前提、内容及方法
  5. hibench 压测flink_【原创】大数据基础之Benchmark(1)HiBench
  6. linux 信号量锁 内核,Linux内核信号量互斥锁应用
  7. DMA讲解《一》(清华大学)
  8. 金山云肖江:5G+AIoT为智慧社区建设插上翅膀
  9. ENVI数据类型和MATLAB数据类型对比
  10. ps排版html,排版教程,超详细适合初学者的排版教程
  11. [原创]fcitx5五笔98版本----安装
  12. uniapp对接极光推送
  13. 查看MySQL初始密码并修改
  14. Mac关闭“屏幕截图”和“清倒废纸篓”音效
  15. 常用的数量统计量的计算及统计意义
  16. 第五章 多变量线性回归
  17. 微信小程序 之wx.previewImage图片预览(多张图片预览)
  18. matlab cui,阻力汽车论文,关于基于Matlab-CUI的汽车动力性相关参考文献资料-免费论文范文...
  19. Delphi XE4 IOS 开发, No eligible applications were found“
  20. Vue百度地图电子围栏

热门文章

  1. android 打开公众号页面_微信公众号页面适配
  2. 基于FPGA的双目相机目标深度图像提取实现——详细版
  3. Kotlin 协程--线程池的7个灵魂拷问
  4. [CTF]攻防世界Simple-check-100题解(GDB)
  5. java皮卡丘代码_用css以写代码形式画一个皮卡丘
  6. 前端优化之if...else判断
  7. Web前端自学容易么?
  8. 软件架构设计分层模型和构图思考(有史以来最全架构图)
  9. android还原短信应用,android – 自动恢复到以前的默认短信应用程序
  10. 得天独厚的生态优势_加快把生态优势转化为经济优势