• 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 所示。

    控制器输出效果
    图 1  控制器输出效果

更多...

加载中...