真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Nodejs中獲取當(dāng)前函數(shù)被調(diào)用的行數(shù)及文件名詳解

背景

創(chuàng)新互聯(lián)堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都做網(wǎng)站、網(wǎng)站建設(shè)、外貿(mào)營(yíng)銷網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的靖江網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

在自定義Egg.js的請(qǐng)求級(jí)別日志這篇文章中,我們實(shí)現(xiàn)了自定義請(qǐng)求級(jí)別的日志模塊。看上去功能是完整了,但好像還缺點(diǎn)什么。

大家在根據(jù)日志追查問(wèn)題的過(guò)程中,很多時(shí)候看到了某條log信息想去找出處,但是實(shí)際上代碼里面打相同類型的log地方可能不止一處,這時(shí)你就比較難去定位這行l(wèi)og到底是哪里打的。

舉個(gè)最極端的例子

//home.js
class AppController extends app.Controller {
 async first() {
 this.ctx.swLog.info('in controller');
 await this.ctx.render('first.html');
 }
 
 async second(){
 this.ctx.swLog.info('in controller')
 await this.ctx.render('second.html');
 }
}

上面的例子雖然比較極端,但是我們?cè)诖a中難免會(huì)碰到類似的情況。兩個(gè)route對(duì)于的controller中都打印了相同的log,你在查日志的時(shí)候,是無(wú)法區(qū)分log到底是first里面打的還是second里面打的。
這個(gè)時(shí)候,我們就需要在日志打印的時(shí)候,同時(shí)也將調(diào)用日志時(shí)的文件名和代碼行數(shù)記錄下來(lái)一并打印,效果如下

[2018-11-02 19:25:09.665][22896][home.js:4][/] in controller

開(kāi)始動(dòng)手

查了很久的Nodejs文檔,發(fā)現(xiàn)Nodejs的api中并沒(méi)有直接提供我們想到的信息,所以只能另找出路。
回憶我們以往的開(kāi)發(fā),這類的信息好像只有在Nodejs拋出異常的時(shí)候看到過(guò)。每當(dāng)Nodejs拋出異常時(shí),我們都能看到一堆異常調(diào)用的堆棧,里面就有我們想要的信息,我們從這開(kāi)始入手。
我們先手動(dòng)創(chuàng)造一個(gè)異常對(duì)象,并打印出來(lái)

function getException() {
 try {
 throw Error('');
 } catch (err) {
 return err;
 }
}
 
let err = getException();
console.log(err);

console的信息如下圖:

Nodejs中獲取當(dāng)前函數(shù)被調(diào)用的行數(shù)及文件名詳解

在圖上我們可以看到,我們想要的信息

Nodejs中獲取當(dāng)前函數(shù)被調(diào)用的行數(shù)及文件名詳解

err對(duì)象在console的時(shí)候,會(huì)直接輸出err對(duì)象中的stack屬性,該屬性是個(gè)字符串,我們可以通過(guò)一系列的字符串操作,拿到我們想要的文件名和行數(shù)。

接下來(lái)我們開(kāi)始對(duì)日志模塊代碼進(jìn)行改造,新增一個(gè)getCallerFileNameAndLine方法,如下:

getCallerFileNameAndLine(){
 function getException() {
  try {
  throw Error('');
  } catch (err) {
  return err;
  }
 }
 
 const err = getException();

 const stack = err.stack;
 const stackArr = stack.split('\n');
 let callerLogIndex = 0;
 for (let i = 0; i < stackArr.length; i++) {
 if (stackArr[i].indexOf('Map.Logger') > 0 && i + 1 < stackArr.length) {
  callerLogIndex = i + 1;
  break;
 }
 }

 if (callerLogIndex !== 0) {
 const callerStackLine = stackArr[callerLogIndex];
 return `[${callerStackLine.substring(callerStackLine.lastIndexOf(path.sep) + 1, callerStackLine.lastIndexOf(':'))}]`;
 } else {
 return '[-]';
 }
}

最終結(jié)果

最后我們每條打印的日志后面,都會(huì)跟上文件名和行數(shù)

Nodejs中獲取當(dāng)前函數(shù)被調(diào)用的行數(shù)及文件名詳解

有的同學(xué)可能擔(dān)心,每次打log都拋一個(gè)異常,會(huì)不會(huì)對(duì)性能造成影響。
我在getCallerFileNameAndLine方法前后進(jìn)行打點(diǎn)統(tǒng)計(jì),平均執(zhí)行時(shí)間在2ms左右,所以是可以忽略不計(jì)的。

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)創(chuàng)新互聯(lián)的支持。


網(wǎng)站名稱:Nodejs中獲取當(dāng)前函數(shù)被調(diào)用的行數(shù)及文件名詳解
網(wǎng)頁(yè)地址:http://weahome.cn/article/ijcgdh.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部