精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

如何在 Node.js 中正確的使用日志對象

開發 前端
日志,是開發者排查問題的非常重要的手段,有時候甚至是唯一的,所以如何合理并正確的打印日志,成了開發時的重中之重。

日志,是開發者排查問題的非常重要的手段,有時候甚至是唯一的,所以如何合理并正確的打印日志,成了開發時的重中之重。

Node.js 中打日志的方式,一般有幾種:

  1. 主動展示
  2. 被動記錄

這兩種方式都可以由不同的模塊來實現,我們接下去就來看看怎么選擇。

**常見的主動展示

**

一般來說,主動一般發生在開發期,不確定狀態的時候,我們會打印一些消息,比如常見的。 

  1. console.log('hello world'); 

這就是最簡單的主動打印的例子。

但是大多數場景下,我們都不會使用 console 來進行打印,畢竟除了內置之外,在性能和功能方面沒有特別的優勢。

除了大眾都知道的 console 模塊,在 Node.js 領域還有一個較為知名的 debug 模塊。

 

可以根據命名空間打印出不同顏色的輸出,但是最最有用的,則是他的環境變量控制能力。 

默認情況下(不包含任何環境變量),控制臺不會有任何輸出,而當 DEBUG 環境變量被賦值的時候,對應的命名空間的輸出才會被打印到 stdout。 

  1. $ DEBUG=* node app.js 

由于 debug 模塊由 TJ 出品,并且在非常早的時候就投入,使用過于廣泛,至今仍有非常多的模塊使用了它。

Node.js 官方一直希望能夠內置一個 debug 模塊。從 v0.11.3 開始,終于加上了一個 util.debuglog 方法。

它的功能和 debug 模塊類似,同時是內置的模塊,所以逐步也有一些模塊開始過渡到它。 

  1. const util = require('util'); 
  2. const debuglog = util.debuglog('foo');  
  3. debuglog('hello from foo [%d]', 123); 

它的開關也類似,使用的是 NODE_DEBUG 環境變量,應該是特意和 debug 模塊做了區分。 

  1. $ NODE_DEBUG=foo node app.js 

被動記錄的方式

除了上面提到的類 console 等方式,我們常見的就是各種日志庫默認記錄的日志,由于這些日志平時只是默默的記錄,并不會過多關注,只會在特殊需要的時候(比如差錯,定位,計算時)才會查看,所以我們歸類為 “被動的方式”。

大多的三方庫都有類似的功能,比如 log4j,winston,pino 等等。

這些庫的核心功能一般是:

  1. 將日志輸出到不同的渠道(比如控制臺、文本文件)
  2. 日志格式的自定義(文本或者 JSON)
  3. 日志的輸出等級(warn,debug,error)
  4. 其他的一些能力,比如切割和文件輪轉,壓縮等等

這些庫用起來一般就比較簡單,獲取實例,調用方法輸出即可。

  1. logger.info('hello world'); 

注意,這里我們會觀察到輸出有一些不一樣的地方。 

  1. 2021-07-22 14:50:59,388 INFO 7739 [xxx] hello world 

整個日志是安裝上面類似標準的結構來進行輸出的,計算是 Error,也是相同的類似格式,那么這個結構包含了哪幾部分東西呢?

日志格式

其實整個日志格式追溯,可以到很久以前,不管是 JAVA 默認的 Simple Logger 結構還是類似 nginx 等反向代理服務器的日志,都會包含一些固定的字段,這些固定的字段長久以來形成了一種輸出約定,將這些字段組合起來,形成了當今的日志格式。

當前的日志格式一般會包括幾個部分。

  • 時間戳
  • 日志等級
  • 進程id(node)
  • 日志的標簽(label,from xxx class)
  • 消息體(字符串或者 error stack)

除此之外,可能還有一些自定義的內容,比如執行消耗的時間,用戶 id,文本長度等等內容。

在文本結構的輸出中,這些字段將被空格(space)分隔,以換行符作為結尾(\n),這樣可以方便外部的日志采集系統采集,比如阿里云的 SLS 等等。

每個公司會有自己的日志采集和輸出規范,所以一般常見的庫都會支持自定義的日志格式,但是不管如何變化,基礎的字段(上述)都還會存在。

隨著系統的迭代,先進使用 JSON 格式來記錄日志的方式也逐步出現,以 Logstash 為首的一些數據(日志)采集分析一體的工具,也逐步的成熟,對結構化的數據支持的也很好,所以現在常見的庫也會同步支持 JSON 格式輸出。 

正確的打日志 

在了解了基本的日志庫和體系之后,我們來具體看一看真正打日志的問題。

比如一個簡單調用遠端服務: 

  1. async invokeRemoteAPI() { 
  2.   const result = await remoteService.got(); 
  3.   return { 
  4.     result 
  5.   }; 

一般,我們會有意識的加上錯誤處理。 

  1. async invokeRemoteAPI() { 
  2.    
  3.   try { 
  4.     const result = await remoteService.got(); 
  5.   } catch(err) { 
  6.     logger.error('got a error, err=', err); 
  7.     throw err; 
  8.   } 
  9.    
  10.   return { 
  11.     result 
  12.   }; 

按照上面的標準格式,這個 logger 還需要其他的一些額外信息,比如: 

  1. async invokeRemoteAPI() { 
  2.    
  3.   const pid = process.pid; 
  4.   const startTime = Date.now(); 
  5.    
  6.   try { 
  7.     const result = await remoteService.got(); 
  8.   } catch(err) { 
  9.     const endTime = Date.now(); 
  10.     logger.error('pid=%s, rt=%s, got a error, err=', pid, Date.now() - startTime, err); 
  11.     throw err; 
  12.   } 
  13.    
  14.   return { 
  15.     result 
  16.   }; 

如果每個代碼都這么寫,就會變得無比冗余,所以,我們會提前將日志的輸出格式定義完畢,這樣,在實際輸出的時候就可以簡化,比如: 

  1. const logger = new CustomLogger({ 
  2.   format: '${timestamp} ${level} ' + process.pid + ${rt}' 
  3. }); 
  4.  
  5. async invokeRemoteAPI() { 
  6.   const startTime = Date.now(); 
  7.    
  8.   try { 
  9.     const result = await remoteService.got(); 
  10.   } catch(err) { 
  11.     const endTime = Date.now(); 
  12.     logger.error('got a error, err=', err, { 
  13.       rt: Date.now() - startTime 
  14.     }); 
  15.     throw err; 
  16.   } 
  17.    
  18.   return { 
  19.     result 
  20.   }; 

所以在特定場景下,如果有固定的日志字段,在日志庫允許自定義的情況下,可以先定義好固定的日志格式。

上下文日志

除了最簡單的通用日志輸出之外,還有一種相對復雜的日志,我們稱之為和上下文(請求)綁定的日志,這類日志會輸出上下文相關聯的數據,比如之前示例中的響應時間,用戶請求的 ip,請求的路由,甚至是鏈路的唯一 ID 等等。

比如: 

  1. 2021-07-22 14:50:59,388 INFO 7739 [-/127.0.0.1/-/0ms GET /] hello world 

這種情況下,再用普通日志的方式加入參數就不合適了。

當然,有些同學會說,我們直接定義一個新的,比如: 

  1. class CustomCtxLogger extends CustomLogger { 
  2.   constructor(ctx, format) { 
  3.     this.ctx = ctx; 
  4.     this.format = format; 
  5.   } 
  6.    
  7.   error(...args) { 
  8.     //xxx 
  9.   } 
  10.    
  11.   info(...args) { 
  12.     //xxx 
  13.   } 

這樣的做法,每次都會讓基類做初始化,會影響部分性能。我們使用另一種方式來減少性能影響,代理傳統日志。

我們來看看最簡單的實現方式,以 koa 為例。 

  1. // 普通日志 
  2. const logger = new CustomLogger(); 
  3.  
  4. class CtxLogger { 
  5.   constructor(ctx, logger) { 
  6.     this.ctx = ctx; 
  7.     this.logger = logger; 
  8.   } 
  9.    
  10.   format() { 
  11.     return '${timestamp} ${level} ' + process.pid + '[${ctx.refer} ${ctx.rt}]' 
  12.   } 
  13.  
  14. app.use(async (ctx, next) => { 
  15.   // 代理原始日志 
  16.   const ctxLogger = new CtxLogger(ctx, logger); 
  17.   ctx.logger = ctxLogger; 
  18.    
  19.   await next(); 
  20. }); 

類似這種通過代理原始日志的方式,即減少了每次初始化新日志時的性能問題,又解決了 ctx 上字段透傳的問題。

這也是常見的上下文日志的實踐。

簡單總結一下

我們了解了常用的日志庫以及和日志打印的關系,也簡單的實現了日志庫以及上下文日志的實現,是不是現在對日志打印了有了一個基本的了解?

這樣一套下來,相信你對 Node.js 打印日志的方式更加的了解,也在排錯時游刃有余了。 

 

責任編輯:龐桂玉 來源: 前端大全
相關推薦

2021-07-30 11:20:53

JavaScriptNode.jsWeb Develop

2020-08-05 08:31:51

SSL TLSNode.js

2021-07-03 17:43:03

Node.jsNode變量

2022-11-17 09:52:12

RHEL 9Node.js

2023-11-26 18:31:41

Linux信號

2021-08-20 16:05:28

JavaScript node.js 應用安全

2015-08-05 09:33:21

Javawaitnotify

2011-09-09 14:23:13

Node.js

2022-08-22 07:26:32

Node.js微服務架構

2022-09-12 15:58:50

node.js微服務Web

2021-07-15 10:15:52

Node.jsJSON前端

2021-05-18 09:01:39

Node.jsJSON文件

2022-08-12 07:01:00

Node.jsXSS腳本

2021-06-15 15:03:21

MongoDBNode.jsCRUD

2022-06-13 07:33:57

socketReact組件

2022-08-28 16:30:34

Node.jsDocker指令

2019-10-18 10:43:11

JPASpring Boot Flyway

2021-05-27 09:00:00

Node.js開發線程

2022-09-04 15:54:10

Node.jsAPI技巧

2023-01-10 14:11:26

點贊
收藏

51CTO技術棧公眾號

116极品美女午夜一级| 大波视频国产精品久久| 91大神福利视频| 136福利精品导航| 在线免费av一区| 国产美女作爱全过程免费视频| 日本中文字幕一区二区有码在线| 奇米影视在线99精品| 欧美黑人xxx| 成都免费高清电影| 白白在线精品| 欧美日韩你懂的| 国产中文字幕视频在线观看| 欧美日韩欧美| 久久久久久久久久久99999| 成人在线精品视频| 欧美黄色一级大片| 伊人精品在线| 日韩色av导航| 欧美18—19性高清hd4k| 国产精品tv| 欧美性色综合网| 成人在线免费观看av| 国产区在线观看| 欧美国产亚洲另类动漫| 成人永久免费| 97人妻一区二区精品免费视频| 综合精品久久| 久久精品成人欧美大片古装| 亚洲综合色一区| 久久久伦理片| 日韩美女主播在线视频一区二区三区| 在线观看av日韩| 中文字幕资源网在线观看免费| 夜夜爽夜夜爽精品视频| 一本二本三本亚洲码| 国产高清免费在线播放| 久久综合999| 精品一区在线播放| 天堂在线观看av| 成人三级在线视频| 91九色露脸| 国产精品久久久久久久成人午夜| 免费观看在线综合| 国产精品久久久久7777婷婷| 国产一级免费视频| 亚洲一区二区网站| 青青久久av北条麻妃黑人| 日韩三级视频在线| 亚洲久色影视| 97在线视频免费观看| 国产小视频在线看| 狠狠色综合网| 992tv成人免费影院| wwwxxx亚洲| 亚洲福利电影| 午夜精品久久久久久久久久久久久| 黄网站免费在线| 精品1区2区3区4区| 91成品人片a无限观看| 日韩成人免费观看| 先锋影音国产一区| 国产成人拍精品视频午夜网站| 久久久久久亚洲av无码专区| 日韩av一区二区在线影视| 国产精品高潮视频| 亚洲图片小说视频| 国产精品综合二区| 国严精品久久久久久亚洲影视| av女名字大全列表| 国产亚洲精品福利| 伊人色综合久久天天五月婷| 国产激情视频在线| 亚洲一区在线观看网站| 成年人观看网站| 精品国产黄a∨片高清在线| 777亚洲妇女| 在线播放av网址| 免费看成人哺乳视频网站| 这里只有精品在线播放| 久热这里有精品| 夜夜爽av福利精品导航| 国产精品青青在线观看爽香蕉| 97人妻精品一区二区三区视频| 国产成人精品三级麻豆| 国产欧美一区二区在线播放| 深夜福利在线看| 国产精品护士白丝一区av| 大地资源网在线观看免费官网| 久草在线视频福利| 在线观看一区日韩| 国产精品日日摸夜夜爽| 精品99久久| 久久艳片www.17c.com| 亚洲另类欧美日韩| 精品一区二区三区免费| 精品国产乱码久久久久久郑州公司 | 天堂中文在线官网| 日本一区二区免费在线| 污污污污污污www网站免费| 色老太综合网| 日韩精品专区在线影院重磅| 欧美熟妇激情一区二区三区| 欧美日韩国产精品一区二区亚洲| 国产精品电影一区| 蜜臀av中文字幕| 国产精品美女久久久久久久网站| 福利视频一区二区三区四区| 日本午夜精品久久久久| 日韩精品中文字幕有码专区 | 亚洲大片精品永久免费| 日韩av手机版| 亚洲免费福利一区| 欧美黑人极品猛少妇色xxxxx | 免费高清不卡av| 国模一区二区三区私拍视频| 成人短视频在线| 日本高清免费不卡视频| 捆绑凌虐一区二区三区| 欧美日韩国产探花| 91丝袜美腿美女视频网站| 国产系列电影在线播放网址| 亚洲亚洲精品在线观看| 亚洲综合在线一区二区| 精品视频免费在线观看| 日韩av电影在线网| 国产又爽又黄网站亚洲视频123| 一区二区成人在线| 日韩a一级欧美一级| 欧美丰满老妇| 国产精品久久久久久久电影| 日本成人一区| 欧美日韩中文字幕日韩欧美| 亚洲av无码一区东京热久久| 好吊日精品视频| 91超碰在线免费观看| 麻豆视频在线| 欧美人成免费网站| 免费91在线观看| 蜜桃一区二区三区在线| 神马影院一区二区| 8av国产精品爽爽ⅴa在线观看| 亚洲精品一区中文| 精品不卡一区二区| www激情久久| 欧美韩国日本在线| 九九综合九九| 国产成人自拍视频在线观看| 精品资源在线看| 欧洲生活片亚洲生活在线观看| 欧美日韩高清丝袜| 久久字幕精品一区| 日韩欧美99| 国产一区精品福利| 日韩中文字幕精品| 国产黄色一区二区| 亚洲二区在线视频| 短视频在线观看| 日韩成人免费看| 午夜一区二区三区| 国产成人久久精品一区二区三区| 久热99视频在线观看| 性一交一乱一透一a级| 天天影视涩香欲综合网| 醉酒壮男gay强迫野外xx| 久久综合九色综合欧美狠狠| 亚洲精品成人三区| 成人综合日日夜夜| 久久久久久久久久婷婷| 日本福利片在线| 欧美精品色一区二区三区| 翔田千里88av中文字幕| 岛国一区二区三区| 成人小视频在线看| 亚洲国产精品日韩专区av有中文| 99久久精品免费看国产四区| 欲香欲色天天天综合和网| 伊人伊成久久人综合网小说| 国产乱淫av片免费| 午夜久久电影网| 精品人妻一区二区三区四区| 国产主播一区二区| 美女日批免费视频| 日韩欧美1区| 国产精品日韩高清| 88xx成人网| 久久久久久久久久久久久久久久久久av| 神马久久久久| 在线观看91精品国产麻豆| 日本系列第一页| 国产日韩欧美精品电影三级在线| 人妻体体内射精一区二区| 夜夜精品视频| 国产精品8888| 禁果av一区二区三区| 99re国产| 成人国产激情在线| 97精品国产91久久久久久| 香港伦理在线| 亚洲精品中文字幕有码专区| 99久久国产热无码精品免费| 色哟哟在线观看一区二区三区| 日韩精品123区| 国产亚洲精品资源在线26u| 在线中文字日产幕| 久久精品国产网站| 国产l精品国产亚洲区久久| 亚洲精品一区二区在线看| 久久综合九色综合网站| 亚洲一区二区免费在线观看| 国产精品网址在线| 中文在线а√天堂| 欧美精品激情视频| 黄色网页在线免费看| 国产亚洲精品久久| 午夜视频在线免费播放| 日韩欧美国产高清| 国产男男gay体育生白袜| 欧洲激情一区二区| 亚洲GV成人无码久久精品| 亚洲午夜久久久久中文字幕久| 日本一级特级毛片视频| 国产精品午夜在线观看| 久久精品国产亚洲av久| 99国内精品久久| 伊人网综合视频| 国产成人精品亚洲777人妖| 在线播放av中文字幕| 美腿丝袜在线亚洲一区| 女人另类性混交zo| 亚洲男人影院| 无罩大乳的熟妇正在播放| 国产精品av久久久久久麻豆网| 美女黄色片网站| 久久一区91| 一本色道久久综合亚洲精品婷婷| 国产精品一区高清| 日韩福利影院| 精品国产一区一区二区三亚瑟| 久热这里只精品99re8久 | free欧美| 国产精品成人国产乱一区| 日韩天堂在线| 国产精品久久久久av免费| 欧美美女日韩| 国产精品久久激情| 日本成人一区二区| 国产在线观看精品| 国产日韩在线观看视频| 亚洲综合日韩在线| 东京久久高清| 精品一区二区三区国产| 日韩av影院| 免费看污久久久| 狠狠色丁香婷婷综合影院| 神马一区二区影院| 亚洲精品网址| 成年人网站国产| 亚洲高清激情| 粗暴91大变态调教| 美女视频一区二区三区| 三级一区二区三区| 成人丝袜高跟foot| 黄色a一级视频| 国产欧美日韩在线观看| 国产一二三av| 亚洲国产日韩精品| 69视频免费看| 欧美高清激情brazzers| 亚洲国产日韩在线观看| 精品无人区乱码1区2区3区在线| 国产一级在线观看| 欧美超级免费视 在线| 免费毛片在线看片免费丝瓜视频| 2019中文字幕在线免费观看| 97久久香蕉国产线看观看| 成人久久精品视频| 成人中文字幕视频| 日日噜噜噜噜夜夜爽亚洲精品| 天天射综合网视频| 黄色国产一级视频| 七七婷婷婷婷精品国产| 91精品又粗又猛又爽| 久久久噜噜噜久久中文字幕色伊伊| 天堂网中文在线观看| 亚洲国产精品嫩草影院| 久久久国产免费| 欧美成人三级电影在线| 春暖花开成人亚洲区| 欧美高清视频在线观看| se69色成人网wwwsex| 国产精品久久久对白| 日韩欧美精品| 成熟丰满熟妇高潮xxxxx视频| 免费国产亚洲视频| 欧美无人区码suv| 亚洲人成电影网站色mp4| 青草视频在线观看免费| 欧美一区二区性放荡片| 精品推荐蜜桃传媒| 欧美激情videoshd| 成人福利一区二区| 久久综合一区| 最新国产拍偷乱拍精品| 天堂av8在线| 国产亚洲午夜高清国产拍精品| 国产亚洲第一页| 欧美剧情电影在线观看完整版免费励志电影| 少妇人妻偷人精品一区二区| 久久精品久久久久久国产 免费| 久久电影tv| 国产精品视频免费一区| 一区二区三区四区日韩| 热久久精品免费视频| 99久久精品国产观看| 人妻久久一区二区| 欧美日韩第一区日日骚| 成人性爱视频在线观看| 2018日韩中文字幕| av不卡一区二区| 日本中文字幕一级片| 精品午夜久久福利影院| youjizz亚洲女人| 在线一区二区三区| 青梅竹马是消防员在线| 欧美有码在线观看视频| 99国产精品免费网站| 狠狠干视频网站| 国产麻豆午夜三级精品| 糖心vlog免费在线观看| 在线播放中文一区| 欧美jizzhd69巨大| 成人国产在线视频| 久久蜜桃av| 日韩成人精品视频在线观看| 中文字幕+乱码+中文字幕一区| 久操视频在线免费观看| 亚洲欧美激情视频| 欧美黑人一区| 视频一区二区三| 久草中文综合在线| 娇小11一12╳yⅹ╳毛片| 欧美丰满一区二区免费视频| 黄色一级大片在线免费看产| 96pao国产成视频永久免费| 亚洲经典一区| 成人三级做爰av| 亚洲国产日韩av| 天堂中文在线8| 日韩免费中文字幕| 国内精品久久久久久久久电影网| 国产成人精品视频ⅴa片软件竹菊| 久久久91精品国产一区二区精品 | 奇米色一区二区| 又嫩又硬又黄又爽的视频| 3751色影院一区二区三区| 性网站在线观看| 国产在线欧美日韩| 视频一区二区欧美| 国产精品麻豆免费版现看视频| 欧美精品乱人伦久久久久久| 在线黄色网页| 久久久7777| 免费看黄色91| 久草福利资源在线观看| 亚洲国产一区自拍| 欧美黄色网页| 激情图片qvod| proumb性欧美在线观看| 日韩不卡高清视频| 久久亚洲电影天堂| 久久中文资源| 久久久久久久久久久久91| 一区二区三区四区国产精品| 天天操天天干天天爱| 国产精品日日做人人爱| 亚洲一区色图| 欧美狂猛xxxxx乱大交3| 欧美另类久久久品| 久久影院午夜精品| 亚洲一区不卡在线| av资源站一区| 国产精品国产三级国产aⅴ | 怡红院成人在线| 超碰在线免费观看97| 99久久精品免费看| 一级特黄aaa| 国内精品一区二区三区四区| 大片网站久久| 中文字幕一区二区人妻电影丶| 欧美亚洲国产一区二区三区| 后进极品白嫩翘臀在线播放| 日韩.欧美.亚洲| 成人综合在线视频| 伊人22222| 98精品国产高清在线xxxx天堂| 999视频精品| 三级视频网站在线观看| 91精品国产入口在线| 国产日韩另类视频一区|