最近2018中文字幕在日韩欧美国产成人片_国产日韩精品一区二区在线_在线观看成年美女黄网色视频_国产精品一区三区五区_国产精彩刺激乱对白_看黄色黄大色黄片免费_人人超碰自拍cao_国产高清av在线_亚洲精品电影av_日韩美女尤物视频网站

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
怎么在zuul上做日志處理

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

成都一家集口碑和實力的網(wǎng)站建設(shè)服務(wù)商,擁有專業(yè)的企業(yè)建站團(tuán)隊和靠譜的建站技術(shù),十載企業(yè)及個人網(wǎng)站建設(shè)經(jīng)驗 ,為成都上1000家客戶提供網(wǎng)頁設(shè)計制作,網(wǎng)站開發(fā),企業(yè)網(wǎng)站制作建設(shè)等服務(wù),包括成都營銷型網(wǎng)站建設(shè),高端網(wǎng)站設(shè)計,同時也為不同行業(yè)的客戶提供成都做網(wǎng)站、網(wǎng)站建設(shè)的服務(wù),包括成都電商型網(wǎng)站制作建設(shè),裝修行業(yè)網(wǎng)站制作建設(shè),傳統(tǒng)機(jī)械行業(yè)網(wǎng)站建設(shè),傳統(tǒng)農(nóng)業(yè)行業(yè)網(wǎng)站制作建設(shè)。在成都做網(wǎng)站,選網(wǎng)站制作建設(shè)服務(wù)商就選創(chuàng)新互聯(lián)建站。

由于zuul作為api網(wǎng)關(guān),所有的請求都經(jīng)過這里,所以在網(wǎng)關(guān)上,可以做請求相關(guān)的日志處理。

我的需求是這樣的,需要記錄請求的 url,ip地址,參數(shù),請求發(fā)生的時間,整個請求的耗時,請求的響應(yīng)狀態(tài),

甚至請求響應(yīng)的結(jié)果等。

很顯然,需要實現(xiàn)這樣的一個功能,需要寫一個ZuulFliter,它應(yīng)該是在請求發(fā)送給客戶端之前做處理,并且在

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

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

現(xiàn)在編碼,在代碼的注釋中,做了詳細(xì)的說明,代碼如下:

@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 params = HttpUtils.getParams(request);
        String paramsStr = params.toString();//請求的參數(shù)
        long statrtTime = (long) context.get("startTime");//請求的開始時間
        Throwable throwable = context.getThrowable();//請求的異常,如果有的話
        request.getRequestURI();//請求的uri
        HttpUtils.getIpAddress(request);//請求的iP地址
        context.getResponseStatusCode();//請求的狀態(tài)
        long duration=System.currentTimeMillis() - statrtTime);//請求耗時
        return null;
    }
}

現(xiàn)在讀者也許有疑問,如何得到的statrtTime,即請求開始的時間,其實這需要另外一個過濾器,在網(wǎng)絡(luò)請求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;
    }
}

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

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

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

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

到此,相信大家對“怎么在zuul上做日志處理”有了更深的了解,不妨來實際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!


當(dāng)前文章:怎么在zuul上做日志處理
文章URL:http://fisionsoft.com.cn/article/phdeii.html