91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么在zuul上做日志處理

發布時間:2021-12-29 09:32:17 來源:億速云 閱讀:187 作者:iii 欄目:軟件技術

本篇內容主要講解“怎么在zuul上做日志處理”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“怎么在zuul上做日志處理”吧!

由于zuul作為api網關,所有的請求都經過這里,所以在網關上,可以做請求相關的日志處理。

我的需求是這樣的,需要記錄請求的 url,ip地址,參數,請求發生的時間,整個請求的耗時,請求的響應狀態,

甚至請求響應的結果等。

很顯然,需要實現這樣的一個功能,需要寫一個ZuulFliter,它應該是在請求發送給客戶端之前做處理,并且在

route過濾器路由之后,在默認的情況下,這個過濾器的order應該為500-1000之間。那么如何獲取這些我需要的

日志信息呢?找RequestContext,在請求的生命周期里這個對象里,存儲了整個請求的所有信息。

現在編碼,在代碼的注釋中,做了詳細的說明,代碼如下:

@Component
public class LoggerFilter extends ZuulFilter {
  
    @Override
    public String filterType() {
        return FilterConstants.POST_TYPE;
    }
    @Override
    public int filterOrder() {
        return FilterConstants.SEND_RESPONSE_FILTER_ORDER - 1;
    }
    @Override
    public boolean shouldFilter() {
        return true;
    }
    @Override
    public Object run() {
        RequestContext context = RequestContext.getCurrentContext();
        HttpServletRequest request = context.getRequest();
        String method = request.getMethod();//氫氣的類型,post get ..
        Map<String, String> params = HttpUtils.getParams(request);
        String paramsStr = params.toString();//請求的參數
        long statrtTime = (long) context.get("startTime");//請求的開始時間
        Throwable throwable = context.getThrowable();//請求的異常,如果有的話
        request.getRequestURI();//請求的uri
        HttpUtils.getIpAddress(request);//請求的iP地址
        context.getResponseStatusCode();//請求的狀態
        long duration=System.currentTimeMillis() - statrtTime);//請求耗時
        return null;
    }
}

現在讀者也許有疑問,如何得到的statrtTime,即請求開始的時間,其實這需要另外一個過濾器,在網絡請求route之前(大部分耗時都在route這一步),在過濾器中,在RequestContext存儲一個時間即可,另寫一個過濾器,代碼如下:

@Component
public class AccessFilter extends ZuulFilter {
    @Override
    public String filterType() {
        return "pre";
    }
    @Override
    public int filterOrder() {
        return 0;
    }
    @Override
    public boolean shouldFilter() {
        return true;
    }
    @Override
    public Object run() {
        RequestContext ctx = RequestContext.getCurrentContext();
        ctx.set("startTime",System.currentTimeMillis());
       
        return null;
    }
}

可能還有這樣的需求,我需要將響應結果,也要存儲在log中,在之前已經分析了,在route結束后,將從具體服務獲取的

響應流存儲在RequestContext中,在SendResponseFilter過濾器寫入在HttpServletResponse中,最終返回給客戶端。那么我只需要在SendResponseFilter寫入響應流之前把響應流寫入到 log日志中即可,那么會引發另外一個問題,因為響應流寫入到 log后,RequestContext就沒有響應流了,在SendResponseFilter就沒有流輸入到HttpServletResponse中,導致客戶端沒有任何的返回數據,那么解決的辦法是這樣的:

InputStream inputStream =RequestContext.getCurrentContext().getResponseDataStream();
InputStream newInputStream= copy(inputStream);
transerferTolog(inputStream);
RequestContext.getCurrentContext().setResponseDataStream(newInputStream);

從RequestContext獲取到流之后,首先將流 copy一份,將流轉化下字符串,存在日志中,再set到RequestContext中,
這樣SendResponseFilter就可以將響應返回給客戶端。這樣的做法有點影響性能,如果不是字符流,可能需要做更多的處理工作。

到此,相信大家對“怎么在zuul上做日志處理”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

宿松县| 无极县| 金华市| 金坛市| 招远市| 阳东县| 阳江市| 彭山县| 西充县| 佳木斯市| 巢湖市| 郎溪县| 乌鲁木齐县| 凤凰县| 孙吴县| 屯门区| 蕲春县| 达日县| 常山县| 荔浦县| 庆阳市| 乌兰浩特市| 大丰市| 遂溪县| 桑日县| 兴海县| 军事| 南皮县| 辽源市| 鄄城县| 自治县| 太湖县| 延庆县| 水富县| 太白县| 宁强县| 南澳县| 土默特左旗| 莱州市| 尚义县| 油尖旺区|