API-Server構(gòu)建指南(3)-日志打印

前面,我們對(duì)spring boot 啟用Filter 進(jìn)行了學(xué)習(xí)與使用。
現(xiàn)在,讓我們來(lái)使用一些簡(jiǎn)單的Filter 來(lái)完成 請(qǐng)求日志

日志,可以說(shuō)是API-Server最不可或缺的組件,完整的日志,是錯(cuò)誤排查的第一步。在不能線上debug的環(huán)境,日志幾乎是我們錯(cuò)誤排查的唯一途徑。

http請(qǐng)求日志,最簡(jiǎn)單的辦法就是在每次請(qǐng)求前,手動(dòng)打一行日志,看起來(lái)比較傻,優(yōu)點(diǎn)是十分靈活,每個(gè)接口都可以按需打印日志,并補(bǔ)充相關(guān)信息,日志可讀性更強(qiáng)。
比較省時(shí)省力的是統(tǒng)一的接口日志,就是將每個(gè)請(qǐng)求,在某個(gè)統(tǒng)一的地方,打印日志。
這里有三種方式

  1. Filter 日志
    針對(duì)request 請(qǐng)求, 使用Servlet 的Filter 用來(lái)打印Http 日志 可以說(shuō) 十分合適。非spring 項(xiàng)目 也可以使用。
public abstract class HttpRequestLogFilter implements Filter {

    
    public void destroy() {
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        HttpUtils.httpRequestLog(request); // 根據(jù)request 中的信息 打印 所需 數(shù)據(jù)
        chain.doFilter(request, resp);
    }
}
  1. Interceptor 日志
    相比于 Filter
    優(yōu)點(diǎn)是 Interceptor 的生命周期被 spring context 所管理,所以可以使用 spring 中的 bean。
    缺點(diǎn)是,Interceptor 的執(zhí)行順序相對(duì)靠后,可能存在一些請(qǐng)求在進(jìn)入 spring 容器前就提前返回了,導(dǎo)致請(qǐng)求無(wú)法打印。
    Interceptor 中,可以 借助 spring的強(qiáng)大機(jī)制,讀取 到 Controller方法上 所使用的 注解,并讀取到注解所注解的值,當(dāng)我們需要對(duì)不同Controller方法 進(jìn)行簡(jiǎn)單的 區(qū)分 處理的時(shí)候,這個(gè) 機(jī)制就可以派上用場(chǎng),比如我可以通過(guò)在 controller 上 添加一個(gè)注解,并補(bǔ)充 一些接口簡(jiǎn)介,在Interceptor 中 便可以讀取并打印。
public class HttpRequestLogInterceptor extends HandlerInterceptorAdapter {

    @Override
    public boolean preHandle(HttpServletRequest req, HttpServletResponse resp, Object handler) throws Exception {
        HttpUtils.httpRequestLog(req);
        return true;
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        super.afterCompletion(request, response, handler, ex);
    }
}

  1. AOP 日志
    這里,其實(shí)也可以 直接使用 強(qiáng)大的 Spring AOP,相對(duì)于 前面的 兩種依賴 Http請(qǐng)求的日志,
    優(yōu)點(diǎn): AOP日志 更為 靈活,同時(shí)可以在不是接口調(diào)用的 地方(比如業(yè)務(wù)邏輯處理層) 繼續(xù)打印日志。還可以結(jié)合注解深度定制。完成各種自定義日志。
    缺點(diǎn): 性能損耗較大,同時(shí)丟失了請(qǐng)求 本身的 http相關(guān)信息,如 HttpMethod,url,ip 等等信息。
  2. 網(wǎng)關(guān)日志
    在打日志這個(gè)需求上,其實(shí)可以跳出 應(yīng)用程序本身的限制。一般 網(wǎng)絡(luò) 請(qǐng)求,在落在我們的服務(wù)之前,還會(huì)有個(gè)網(wǎng)關(guān)層,如Kong/Nginx,經(jīng)過(guò)合理的配置,可以通過(guò)網(wǎng)關(guān)來(lái)打印日志,優(yōu)點(diǎn)是,打印的地點(diǎn)非常早,可以做到不漏任何異常情況,與代碼充分解耦,每個(gè)項(xiàng)目都不需要去處理http入口日志工作。缺點(diǎn)是不好做一些自定義的個(gè)性化的請(qǐng)求日志。每個(gè)項(xiàng)目配置不同的日志打印姿勢(shì),又失去了網(wǎng)關(guān)日志的簡(jiǎn)單粗暴原則。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容