用 zuulFilter 打印请求日志
一. 为什么要用到这个
用了 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 打印请求日志相关推荐
- java http打印请求日志_spring打印http接口请求和响应
在程序日志中打印出接口请求和响应的内容是一个基本的技术需求.如果在每个接口中实现请求响应的日志打印,程序编写会很繁琐,我们可以利用spring提供的机制,集中处理接口请求响应的日志打印. 具体的代码参 ...
- SpringBoot切面AOP打印请求和响应日志
1.说明 Spring Boot微服务对外开放的Restful接口, 为了方便定位问题, 一般需要记录请求日志和响应日志, 而在每个接口中开发日志代码是非常繁琐的, 本文介绍使用Spring的切面AO ...
- Spring Boot 2.1之后如何在启动日志中打印请求路径列表
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | 翟永超 来源 | http://blog.di ...
- Android 开发之Okhttp网络请求日志打印
这里写自定义目录标题 Android 开发之Okhttp 网络请求日志打印 OkHTTP网络日志打印 Android 开发之Okhttp 网络请求日志打印 网络请求是开发的日常工作内容之一,网络日志打 ...
- java main 方法使用 HttpClients发送请求 不打印debug日志
记录目的:java main 方法使用HttpClients发送请求不打印debug日志 记录背景: 使用java main方法测试接口响应时间 发现问题: 控制台打印巨多debug日志 解决方法: ...
- Retrofit打印网络请求日志
用过Retrofit的朋友肯定知道使用Retrofit进行网络网络请求非常的方便简洁,但是要打印网络请求的日志还是要自己另想办法.昨天在网上找了一圈,发现要打印日志,大部分的帖子都是引入OkHttp3 ...
- 查看LoadRunner脚本请求日志和服务器返回值方法
1. 查看所有请求日志和请求响应信息: 采用LoadRunner工具Run-time settings或按键盘F4,选择LOG设置,选择Extended log->Data returned ...
- 使用 monitor 命令查看 redis 请求日志
monitor日志要实时拿 redis 是一个高性能.使用方便的非关系型数据库,我们在使用 redis 时,基本只需要关注存数据,取数据的功能,即 set,get,非常适合用作缓存服务器,降低后端数据 ...
- 实现打印异常日志_老生常谈SpringAop日志收集与处理做的工具包
场景 : 使用Spring Aop拦截参数日志目前大部分做法都基本上大同小异,不想日后每个项目工程都写一份这样的Aop拦截处理日志的代码,甚至代码侵入. 我想知道一些相对重要的请求方法的请求参数,响应 ...
最新文章
- 自动驾驶系统关系与自动泊车原理
- 取代人类医生?AI给你做的诊断你敢信吗
- java byte 正数最大_为什么Java byte 类型的取值范围是-128~127
- 会计——会计核算前提、内容及方法
- hibench 压测flink_【原创】大数据基础之Benchmark(1)HiBench
- linux 信号量锁 内核,Linux内核信号量互斥锁应用
- DMA讲解《一》(清华大学)
- 金山云肖江:5G+AIoT为智慧社区建设插上翅膀
- ENVI数据类型和MATLAB数据类型对比
- ps排版html,排版教程,超详细适合初学者的排版教程
- [原创]fcitx5五笔98版本----安装
- uniapp对接极光推送
- 查看MySQL初始密码并修改
- Mac关闭“屏幕截图”和“清倒废纸篓”音效
- 常用的数量统计量的计算及统计意义
- 第五章 多变量线性回归
- 微信小程序 之wx.previewImage图片预览(多张图片预览)
- matlab cui,阻力汽车论文,关于基于Matlab-CUI的汽车动力性相关参考文献资料-免费论文范文...
- Delphi XE4 IOS 开发, No eligible applications were found“
- Vue百度地图电子围栏
热门文章
- android 打开公众号页面_微信公众号页面适配
- 基于FPGA的双目相机目标深度图像提取实现——详细版
- Kotlin 协程--线程池的7个灵魂拷问
- [CTF]攻防世界Simple-check-100题解(GDB)
- java皮卡丘代码_用css以写代码形式画一个皮卡丘
- 前端优化之if...else判断
- Web前端自学容易么?
- 软件架构设计分层模型和构图思考(有史以来最全架构图)
- android还原短信应用,android – 自动恢复到以前的默认短信应用程序
- 得天独厚的生态优势_加快把生态优势转化为经济优势