Spring Cloud Zuul请求响应信息输出
系统在生产环境出现问题时,排查问题最好的方式就是查看日志了,日志的记录尽量详细,这样你才能快速定位问题。
下面带大家学习如何在 Zuul 中输出请求响应的信息来辅助我们解决一些问题。
熟悉 Zuul 的朋友都知道,Zuul 中有 4 种类型过滤器,每种都有特定的使用场景,要想记录响应数据,那么必须是在请求路由到了具体的服务之后,返回了才有数据,这种需求就适合用 post 过滤器来实现了。代码如下所示。
HttpServletRequest req = (HttpServletRequest) RequestContext.getCurrentContext().getRequest(); System.err.println("REQUEST:: " + req.getScheme() + " " + req.getRemoteAddr() + ":" + req.getRemotePort()); StringBuilder params = new StringBuilder("?"); // 获取URL参数 Enumeration<String> names = req.getParameterNames(); if (req.getMethod().equals("GET")) { while (names.hasMoreElements()) { String name = (String) names.nextElement(); params.append(name); params.append("="); params.append(req.getParameter(name)); params.append("&"); } } if (params.length() > 0) { params.delete(params.length() - 1, params.length()); } System.err.println( "REQUEST:: > " + req.getMethod() + " " + req.getRequestURI() + params + " " + req.getProtocol()); Enumeration<String> headers = req.getHeaderNames(); while (headers.hasMoreElements()) { String name = (String) headers.nextElement(); String value = req.getHeader(name); System.err.println("REQUEST:: > " + name + ":" + value); } final RequestContext ctx = RequestContext.getCurrentContext(); // 获取请求体参数 if (!ctx.isChunkedRequestBody()) { ServletInputStream inp = null; try { inp = ctx.getRequest().getInputStream(); String body = null; if (inp != null) { body = IOUtils.toString(inp); System.err.println("REQUEST:: > " + body); } } catch (IOException e) { e.printStackTrace(); } }
输出效果如图 1 所示。
发表评论