Nodejs中获取当前函数被调用的行数及文件名详解


Posted in NodeJs onDecember 12, 2018

背景

在自定义Egg.js的请求级别日志这篇文章中,我们实现了自定义请求级别的日志模块。看上去功能是完整了,但好像还缺点什么。

大家在根据日志追查问题的过程中,很多时候看到了某条log信息想去找出处,但是实际上代码里面打相同类型的log地方可能不止一处,这时你就比较难去定位这行log到底是哪里打的。

举个最极端的例子

//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');
 }
}

上面的例子虽然比较极端,但是我们在代码中难免会碰到类似的情况。两个route对于的controller中都打印了相同的log,你在查日志的时候,是无法区分log到底是first里面打的还是second里面打的。
这个时候,我们就需要在日志打印的时候,同时也将调用日志时的文件名和代码行数记录下来一并打印,效果如下

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

开始动手

查了很久的Nodejs文档,发现Nodejs的api中并没有直接提供我们想到的信息,所以只能另找出路。
回忆我们以往的开发,这类的信息好像只有在Nodejs抛出异常的时候看到过。每当Nodejs抛出异常时,我们都能看到一堆异常调用的堆栈,里面就有我们想要的信息,我们从这开始入手。
我们先手动创造一个异常对象,并打印出来

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

console的信息如下图:

Nodejs中获取当前函数被调用的行数及文件名详解

在图上我们可以看到,我们想要的信息

Nodejs中获取当前函数被调用的行数及文件名详解

err对象在console的时候,会直接输出err对象中的stack属性,该属性是个字符串,我们可以通过一系列的字符串操作,拿到我们想要的文件名和行数。

接下来我们开始对日志模块代码进行改造,新增一个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 '[-]';
 }
}

最终结果

最后我们每条打印的日志后面,都会跟上文件名和行数

Nodejs中获取当前函数被调用的行数及文件名详解

有的同学可能担心,每次打log都抛一个异常,会不会对性能造成影响。
我在getCallerFileNameAndLine方法前后进行打点统计,平均执行时间在2ms左右,所以是可以忽略不计的。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

NodeJs 相关文章推荐
NodeJS学习笔记之Connect中间件应用实例
Jan 27 NodeJs
Nodejs学习笔记之测试驱动
Apr 16 NodeJs
nodejs通过phantomjs实现下载网页
May 04 NodeJs
Nodejs进阶:基于express+multer的文件上传实例
Nov 21 NodeJs
nodejs+websocket实时聊天系统改进版
May 18 NodeJs
nodejs后台集成ueditor富文本编辑器的实例
Jul 11 NodeJs
使用vs code开发Nodejs程序的使用方法
Sep 21 NodeJs
基于nodejs实现微信支付功能
Dec 20 NodeJs
Nodejs下使用gm圆形裁剪并合成图片的示例
Feb 22 NodeJs
nodejs acl的用户权限管理详解
Mar 14 NodeJs
nodejs的路径问题的解决
Jun 30 NodeJs
详解NodeJs项目 CentOs linux服务器线上部署
Sep 16 NodeJs
nodejs图片处理工具gm用法小结
Dec 12 #NodeJs
详解nodejs解压版安装和配置(带有搭建前端项目脚手架)
Dec 06 #NodeJs
NodeJs实现简单的爬虫功能案例分析
Dec 05 #NodeJs
nodejs 使用 js 模块的方法实例详解
Dec 04 #NodeJs
使用koa-log4管理nodeJs日志笔记的使用方法
Nov 30 #NodeJs
nodejs 使用nodejs-websocket模块实现点对点实时通讯
Nov 28 #NodeJs
NodeJs 文件系统操作模块fs使用方法详解
Nov 26 #NodeJs
You might like
PHP中::、-&amp;gt;、self、$this几种操作符的区别介绍
2013/04/24 PHP
Laravel日志用法详解
2016/10/09 PHP
PHP中一个有趣的preg_replace函数详解
2018/08/15 PHP
PHP实现的简单留言板功能示例【基于thinkPHP框架】
2018/12/07 PHP
PHP实现的敏感词过滤方法示例
2019/03/06 PHP
Div Select挡住的解决办法
2008/08/07 Javascript
ASP.NET jQuery 实例16 通过控件CustomValidator验证RadioButtonList
2012/02/03 Javascript
仿淘宝TAB切换搜索框搜索切换的相关内容
2014/09/21 Javascript
jQuery控制DIV层实现由大到小,由远及近动画变化效果
2015/10/09 Javascript
第一次接触JS require.js模块化工具
2016/04/17 Javascript
详解Angular的8个主要构造块
2017/06/20 Javascript
推荐VSCode 上特别好用的 Vue 插件之vetur
2017/09/14 Javascript
利用adb shell和node.js实现抖音自动抢红包功能(推荐)
2018/02/22 Javascript
vuex实现的简单购物车功能示例
2019/02/13 Javascript
详解webpack 最简打包结果分析
2019/02/20 Javascript
webpack 如何解析代码模块路径的实现
2019/09/04 Javascript
UEditor 自定义图片视频尺寸校验功能的实现代码
2020/10/20 Javascript
讲解Python中的递归函数
2015/04/27 Python
使用Python操作MySQL的一些基本方法
2015/08/16 Python
举例讲解Python中的迭代器、生成器与列表解析用法
2016/03/20 Python
python通过百度地图API获取某地址的经纬度详解
2018/01/28 Python
Python3实现的旋转矩阵图像算法示例
2019/04/03 Python
python多线程同步实例教程
2019/08/11 Python
Python  word实现读取及导出代码解析
2020/07/09 Python
Nike挪威官网:Nike.com (NO)
2018/11/26 全球购物
服装创业计划书范文
2014/02/05 职场文书
剪彩仪式主持词
2014/03/19 职场文书
房产买卖委托公证书
2014/04/04 职场文书
房产委托公证书
2014/04/08 职场文书
班主任评语大全
2014/04/26 职场文书
中国梦演讲稿5分钟
2014/08/19 职场文书
领导干部四风问题自我剖析材料
2014/09/25 职场文书
2014年小学体育工作总结
2014/12/11 职场文书
2014年纳税评估工作总结
2014/12/23 职场文书
关于军训的感想
2015/08/07 职场文书
2019西餐厅创业计划书范文!
2019/07/12 职场文书