国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Node.js + ELK 日志規(guī)范

tuomao / 696人閱讀

摘要:日志規(guī)范一般前端開發(fā)同學(xué),對日志其實不太敏感,畢竟前端大多數(shù)情況下,不太關(guān)心日志。本文主要梳理了目前我們團(tuán)隊在開發(fā)中日志方面存在的問題,以及通過統(tǒng)一日志規(guī)范,希望達(dá)到什么樣的效果。日志格式字段日志格式統(tǒng)一采用,便于解析處理。

nodejs 日志規(guī)范

一般前端開發(fā)同學(xué),對日志其實不太敏感,畢竟前端大多數(shù)情況下,不太關(guān)心日志。即使有,也可能調(diào)用一些第三方的統(tǒng)計,比如百度統(tǒng)計或者別的等。在 Node.js(下文中簡稱node) 推進(jìn)過程中,也發(fā)現(xiàn)我們平常打日志太隨意,該打的日志沒有打,打的一些關(guān)鍵日志缺少必要上下文信息,導(dǎo)致在線上定位問題的時候很困難。

本文主要梳理了目前我們團(tuán)隊在nodejs開發(fā)中日志方面存在的問題,以及通過統(tǒng)一日志規(guī)范,希望達(dá)到什么樣的效果。

問題

node日志不規(guī)范,打日志太隨意

沒有良好的日志格式、約定的字段,在 ELK 里不能很好的解析&檢索 (PS: ELK文章在路上)

由于node對接的后端服務(wù)化,調(diào)用鏈不清晰,定位問題困難

數(shù)據(jù)部門對node日志的使用,沒有明確的記錄。node修改了日志,導(dǎo)致統(tǒng)計數(shù)據(jù)異常

目標(biāo)

規(guī)范日志打印字段&格式,便于 ELK 檢索

增強(qiáng)node上下游(nginx/后端)日志格式,加入惟一 requestId,方便微服務(wù)下定位問題

統(tǒng)計應(yīng)用運(yùn)行情況,性能數(shù)據(jù)

維護(hù)數(shù)據(jù)部門對node日志的使用情況

實現(xiàn)方案 日志類型

參考一些日志的最佳實踐,目前將node日志分為如下幾種類型(scope):

desc: 系統(tǒng)啟動、運(yùn)行過程中,打的日志,表明系統(tǒng)的一些啟動日志、啟動參數(shù)等,也包含在 不能 捕獲到http上下文的時候,打的日志

stat: 系統(tǒng)性能統(tǒng)計日志,應(yīng)用會定時收集一些性能信息,便于查詢應(yīng)用當(dāng)前狀態(tài)

visit: 每個http請求相關(guān)的日志,會包含惟一的 requestId,定位該請求相關(guān)的所有日志

biz: 業(yè)務(wù)數(shù)據(jù)相關(guān)日志,主要提供給數(shù)據(jù)統(tǒng)計使用

日志級別

只使用 FATALERRORWARNINFODEBUG 等級。


FATAL - 導(dǎo)致程序退出的嚴(yán)重系統(tǒng)級錯誤,不可恢復(fù),當(dāng)錯誤發(fā)生時,系統(tǒng)管理員需要立即介入,一般應(yīng)用代碼 使用。

ERROR - 運(yùn)行時異常以及預(yù)期之外的錯誤,也需要立即處理,但緊急程度低于FATAL,當(dāng)錯誤發(fā)生時,影響了程序的正確執(zhí)行。需要注意的是這兩種級別屬于服務(wù)自己的錯誤,需要管理員介入,用戶輸入出錯不屬于此分類,請求后端、讀文件、數(shù)據(jù)庫等超時、返回錯誤結(jié)構(gòu),屬于ERROR

WARN - 預(yù)期之外的運(yùn)行時狀況,表示系統(tǒng)可能出現(xiàn)問題。對于那些目前還不是錯誤,然而不及時處理也會變成錯誤的情況,也可以記為WARN,如磁盤過低。

INFO - 有意義的事件信息,記錄程序正常的運(yùn)行狀態(tài),比如收到請求,成功執(zhí)行。通過查看INFO,可以快速定位WARN,ERROR, FATAL。INFO不宜過多,通常情況下不超過 DEBUG 的10%。

DEBUG - 與程序運(yùn)行時的流程相關(guān)的詳細(xì)信息以及當(dāng)前變量狀態(tài)。

日志格式/字段

日志格式統(tǒng)一采用 JSON ,便于 ELK 解析處理。

日志中的各個字段的值,都應(yīng)該盡量使用 英文 ,不使用中文。

日志具體字段,分為 基礎(chǔ)數(shù)據(jù) + 擴(kuò)展數(shù)據(jù)。基礎(chǔ)數(shù)據(jù),是底層日志框架自帶的,所有日志都會包含。擴(kuò)展數(shù)據(jù),不同類型的日志,包含不同的字段。

日志基礎(chǔ)數(shù)據(jù)

目前使用的 node-bunyan 日志庫,官方文檔,基礎(chǔ)字段包含如下:

v: integer 。bunyan的日志版本號

level: integer。日志級別對應(yīng)的數(shù)字

name: string。服務(wù)名

hostname: string。主機(jī)名

pid: integer。進(jìn)程號

time: string。UTC 格式的日期

msg: string。日志主體信息

日志擴(kuò)展數(shù)據(jù)

下面定義的各個數(shù)據(jù)類型的擴(kuò)展數(shù)據(jù),不是 全部的字段,僅包含該日志類型下,必需的字段。這些必需的擴(kuò)展字段,需要在 ELK 中建立索引,方便定位各種問題。

    desc類型日志,擴(kuò)展字段:TODO

    stat類型日志,擴(kuò)展字段:{ perf: {rss: xxxx, cpu: xxx} }

    visit類型日志,擴(kuò)展字段:

    biz

{
    /////////////  基礎(chǔ)數(shù)據(jù)  ////////
    v: 1,
    level: 20,
    ///////////// 擴(kuò)展字段  ////////
    // 標(biāo)志日志類型
    scope: "visit",
    //事件類型:在 visit 的日志類型下,還會細(xì)分不同的事件,比如 client-req、client-res、 普通trace、請求后端service-start, service-end, service-err等。
    event: "trace",
    //客戶端ID,追蹤用戶、設(shè)備會話。在web端,可以是長期的cookie;在APP端,可以是device-id等
    rrdid: "",
    //本次請求的惟一ID,串聯(lián)本次請求的所有相關(guān)日志
    req_id: "some-uuid-for-request",
    //本次請求的用戶ID
    uid: "",
    //本次請求的客戶端相關(guān)數(shù)據(jù),通過  ctx.logger 打日志時,自動加上
    d: {
        url: "/some/path");,
        //客戶端ip
        ip: "10.138.10.1",
        //客戶端的 userAgent
        ua: ""
    },
    //本次node請求的處理時間,毫秒
    tm: 500,
    //該日志相關(guān)的上下文數(shù)據(jù),盡量拼成一個字符串,放在 extra 里
    extra: "",

    //ERROR 級別日志,最好包含error相關(guān)信息,比如請求后端相關(guān)參數(shù)等
    err: {
        msg: "",
        stack: ""
    },

    //調(diào)用后端服務(wù)相關(guān)參數(shù)和響應(yīng)
    service_req: {
        host: "",
        path: "",
        payload: ""
    },
    service_res: {
        //http狀態(tài)碼
        http_code: 200,
        //響應(yīng)時間
        tm: 100,
        //響應(yīng)的body
        body: "",
        //異常信息
        err: ""
    }
}
什么時候打日志

開發(fā)者目前只關(guān)心 visit 類型的日志,即和某一次http請求相關(guān)聯(lián)的日志。descstat類型的日志,統(tǒng)一由開發(fā)框架封裝后實現(xiàn),業(yè)務(wù)開發(fā) 不用 關(guān)心。下面講的,都是針對 visit 類型的日志。

一次http請求,會打出一系列相關(guān)聯(lián)的日志。在node層,通常一次請求,會進(jìn)一步轉(zhuǎn)發(fā)給N個后端服務(wù),然后對后端數(shù)據(jù)進(jìn)行一些處理、合并等操作,最后渲染頁面或是輸出JSON。因此,一次請求相關(guān)的日志,大體分為以下幾種 event

client-req: client請求到達(dá)node層,統(tǒng)一由框架打日志,開發(fā) 關(guān)心

service-start: node對某個后端服務(wù)發(fā)起請求,由通用請求庫負(fù)責(zé)打日志,開發(fā) 關(guān)心

service-end: node請求某個后端服務(wù)結(jié)束,由通用請求庫負(fù)責(zé)打日志,開發(fā) 關(guān)心

service-err: node請求后端服務(wù)異常,由通用請求庫負(fù)責(zé)打日志,開發(fā) 關(guān)心。調(diào)用后端服務(wù)異常,日志級別為 WARN不是 ERROR

trace: node中業(yè)務(wù)層打的日志,如果異常,能幫助定位本次請求相關(guān)問題

client-res: 結(jié)束client的請求,打印本次請求的http code,本次請求處理時間等,由框架統(tǒng)一打,開發(fā) 關(guān)心

開發(fā)同學(xué)在打日志時,應(yīng)該謹(jǐn)慎的選擇級別,INFO(含)級別以上,都應(yīng)該能對定位問題、具體業(yè)務(wù)統(tǒng)計需求有要求,才能使用。大部分情況下,可以使用 DEBUG 級別,線上 不會 開啟DEBUG級別。

具體方法調(diào)用

針對打印 visit類型的日志,調(diào)用 ctx.logger(基于Koa的框架) 屬性打日志,推薦參數(shù)都傳遞 JSON,具體方法如下:

ctx.logger.debug({msg: "", "extra": "a=1 b=2 c=value"});
ctx.logger.info({msg: "xxx", "extra": "其他的額外字段"});
ctx.logger.warn({msg: "xxx", "extra": "額外上下文數(shù)據(jù)"});
//ERROR級別日志,應(yīng)該提供 Error 對象
ctx.logger.error({msg: "xxx", err: error, extra: ""});

注意1,額外的參數(shù),推薦存放在 extra 字段中,統(tǒng)一拼成 string;如果確實有必要多帶帶出每個字段, 禁止 額外的參數(shù)占用上述通用字段名!!

注意2,基礎(chǔ)數(shù)據(jù)中的msg字段,禁止 包含具體的上下文數(shù)據(jù),和該日志相關(guān)的上下文數(shù)據(jù),應(yīng)該拼成字符串,放在多帶帶的 extra 字段中。比如,某個用戶登錄接口,希望統(tǒng)計調(diào)用次數(shù),可以這樣打印:

ctx.logger.info({msg: "user login", "extra": "mobile=18712387101 code=xxxx k3=value3"});
參考資料

最佳日志實踐(v2.0)

Node 框架接入 ELK 實踐總結(jié)

大搜車NodeJS日志規(guī)范化與分析監(jiān)控

請自查!這些優(yōu)秀日志實踐準(zhǔn)則,你做到了幾點?

日志最佳實踐

When to use the different log levels

Java 日志管理最佳實踐

關(guān)于日志打印的幾點建議以及非最佳實踐

日志記錄最佳實踐

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/6964.html

相關(guān)文章

  • 超長干貨:基于Docker的DevOps CI/CD實踐——來自iHealth的分享

    摘要:在貓屎氤氳的霧氣里角仰望天花板,手機(jī)微信提醒這次構(gòu)建成功或失敗,并附帶污言穢語。這時他可以開始往工位走,坐下時,微信又會提醒本次部署到成功或失敗。與企業(yè)微信的集成在決定使用之前,需要知道的是,是一個高度依賴社區(qū)的項目。 前言 相信我,一切事情的發(fā)生都是趕鴨子上架,沒有例外。人類所有偉大的變革都是迫不得已,可又是那么順其自然。比如容器(docker)技術(shù)的誕生,比如箭在弦上的創(chuàng)業(yè),比如野...

    Dongjie_Liu 評論0 收藏0
  • 使用ELK處理Docker日志(二)

    摘要:環(huán)境要求由,和容器組成使用日志收集器將日志發(fā)送到。若使用自己的部署,分析和可視化日志的概念保持不變。日志可視化以索引數(shù)據(jù)為基礎(chǔ)創(chuàng)建豐富的可視化和儀表板的能力而聞名,事實上,得到這些數(shù)據(jù)并不容易。 昨天小數(shù)分享的使用ELK處理Docker日志(一)很受歡迎,今天迫不及待的帶來第二篇,側(cè)重于分析和可視化,期待給您帶來幫助:) 噓,聽說數(shù)人云工程師們在奧斯汀DockerCON2017買了D...

    LiveVideoStack 評論0 收藏0
  • 如何在 Rancher 中統(tǒng)一管理容器日志

    摘要:在中默認(rèn)開啟端口用于偵聽發(fā)送過來的日志報文。至此,在中如何部署一套完整系統(tǒng)已經(jīng)介紹完了,下面我將介紹如何將容器日志發(fā)送到中。下面我將介紹如何收集容器日志。目前日志顯的雜亂無序。,現(xiàn)在我們再去查看發(fā)現(xiàn)我們的容器日志已經(jīng)展示在這里了。 相信大家對于容器和 docker 這個概念并不陌生,很高興的是 docker 為我們提供了多種log-driver。 showImg(https://se...

    whinc 評論0 收藏0
  • Java日志正確使用姿勢

    摘要:但是往往越簡單的東西越容易讓我們忽視,從而導(dǎo)致一些不該有的發(fā)生,作為一名嚴(yán)謹(jǐn)?shù)某绦騿T,怎么能讓這種事情發(fā)生呢所以下面我們就來了解一下關(guān)于日志的那些正確使用姿勢。級別表示出現(xiàn)了嚴(yán)重錯誤,程序?qū)袛鄨?zhí)行。 前言 關(guān)于日志,在大家的印象中都是比較簡單的,只須引入了相關(guān)依賴包,剩下的事情就是在項目中盡情的打印我們需要的信息了。但是往往越簡單的東西越容易讓我們忽視,從而導(dǎo)致一些不該有的bug發(fā)...

    UCloud 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<