您好,登錄后才能下訂單哦!
一般前端開發同學,對日志其實不太敏感,畢竟前端大多數情況下,不太關心日志。即使有,也可能調用一些第三方的統計,比如百度統計或者別的等。在 Node.js(下文中簡稱node) 推進過程中,也發現我們平常打日志太隨意,該打的日志沒有打,打的一些關鍵日志缺少必要上下文信息,導致在線上定位問題的時候很困難。
本文主要梳理了目前我們團隊在nodejs開發中日志方面存在的問題,以及通過統一日志規范,希望達到什么樣的效果。
問題
目標
實現方案
日志類型
參考一些日志的最佳實踐,目前將node日志分為如下幾種類型(scope):
日志級別
只使用 FATAL、ERROR、WARN、INFO 和 DEBUG 等級。
日志格式/字段
日志基礎數據
目前使用的 node-bunyan 日志庫,官方文檔,基礎字段包含如下:
日志擴展數據
下面定義的各個數據類型的擴展數據,不是 全部的字段,僅包含該日志類型下,必需的字段。這些必需的擴展字段,需要在 ELK 中建立索引,方便定位各種問題。
{ ///////////// 基礎數據 //////// v: 1, level: 20, ///////////// 擴展字段 //////// // 標志日志類型 scope: "visit", //事件類型:在 visit 的日志類型下,還會細分不同的事件,比如 client-req、client-res、 普通trace、請求后端service-start, service-end, service-err等。 event: "trace", //客戶端ID,追蹤用戶、設備會話。在web端,可以是長期的cookie;在APP端,可以是device-id等 rrdid: "", //本次請求的惟一ID,串聯本次請求的所有相關日志 req_id: "some-uuid-for-request", //本次請求的用戶ID uid: "", //本次請求的客戶端相關數據,通過 ctx.logger 打日志時,自動加上 d: { url: "/some/path?include-query", //客戶端ip ip: "10.138.10.1", //客戶端的 userAgent ua: "" }, //本次node請求的處理時間,毫秒 tm: 500, //該日志相關的上下文數據,盡量拼成一個字符串,放在 extra 里 extra: "", //ERROR 級別日志,最好包含error相關信息,比如請求后端相關參數等 err: { msg: "", stack: "" }, //調用后端服務相關參數和響應 service_req: { host: "", path: "", payload: "" }, service_res: { //http狀態碼 http_code: 200, //響應時間 tm: 100, //響應的body body: "", //異常信息 err: "" } }
什么時候打日志
開發者目前只關心 visit 類型的日志,即和某一次http請求相關聯的日志。desc和stat類型的日志,統一由開發框架封裝后實現,業務開發 不用 關心。下面講的,都是針對 visit 類型的日志。
一次http請求,會打出一系列相關聯的日志。在node層,通常一次請求,會進一步轉發給N個后端服務,然后對后端數據進行一些處理、合并等操作,最后渲染頁面或是輸出JSON。因此,一次請求相關的日志,大體分為以下幾種 event:
開發同學在打日志時,應該謹慎的選擇級別,INFO(含)級別以上,都應該能對定位問題、具體業務統計需求有要求,才能使用。大部分情況下,可以使用 DEBUG 級別,線上 不會 開啟DEBUG級別。
具體方法調用
針對打印 visit類型的日志,調用 ctx.logger(基于Koa的框架) 屬性打日志,推薦參數都傳遞 JSON,具體方法如下:
ctx.logger.debug({msg: "", "extra": "a=1 b=2 c=value"}); ctx.logger.info({msg: "xxx", "extra": "其他的額外字段"}); ctx.logger.warn({msg: "xxx", "extra": "額外上下文數據"}); //ERROR級別日志,應該提供 Error 對象 ctx.logger.error({msg: 'xxx', err: error, extra: ""});
注意1,額外的參數,推薦存放在 extra 字段中,統一拼成 string;如果確實有必要單獨出每個字段, 禁止 額外的參數占用上述通用字段名!!
注意2,基礎數據中的msg字段,禁止 包含具體的上下文數據,和該日志相關的上下文數據,應該拼成字符串,放在單獨的 extra 字段中。比如,某個用戶登錄接口,希望統計調用次數,可以這樣打印:
ctx.logger.info({msg: "user login", "extra": 'mobile=18712387101 code=xxxx k3=value3'});
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。