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 url验证(url-valid)的使用方法
Nov 18 NodeJs
nodejs批量修改文件编码格式
Jan 22 NodeJs
使用nodejs开发cli项目实例
Jun 03 NodeJs
Nodejs Stream 数据流使用手册
Apr 17 NodeJs
nodejs利用http模块实现银行卡所属银行查询和骚扰电话验证示例
Dec 30 NodeJs
nodejs根据ip数组在百度地图中进行定位
Mar 06 NodeJs
nodejs中向HTTP响应传送进程的输出
Mar 19 NodeJs
Express+Nodejs 下的登录拦截实现代码
Jul 01 NodeJs
深入解析nodejs HTTP服务
Jul 25 NodeJs
nodejs 最新版安装npm 的使用详解
Jan 18 NodeJs
nodejs基于express实现文件上传的方法
Mar 19 NodeJs
nodejs实现范围请求的实现代码
Oct 12 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递归函数中使用return的注意事项
2014/01/17 PHP
PHP获取当前所在目录位置的方法
2014/11/26 PHP
教你在header中隐藏php的版本信息
2016/08/10 PHP
php慢查询日志和错误日志使用详解
2021/02/27 PHP
javascript firefox兼容ie的dom方法脚本
2008/05/18 Javascript
div当滚动到页面顶部的时候固定在顶部实例代码
2013/05/27 Javascript
由点击页面其它地方隐藏div所想到的jQuery的delegate
2013/08/29 Javascript
js history对象简单实现返回和前进
2013/10/30 Javascript
Mac/Windows下如何安装Node.js
2013/11/22 Javascript
推荐一款jQuery插件模板
2015/01/09 Javascript
用jQuery向div中添加Html文本内容的简单实现
2016/07/13 Javascript
AngularJS中的包含详细介绍及实现示例
2016/07/28 Javascript
基于JS快速实现导航下拉菜单动画效果附源码下载
2016/10/27 Javascript
百度搜索框智能提示案例jsonp
2016/11/28 Javascript
详解VUE的状态控制与延时加载刷新
2017/03/27 Javascript
weex slider实现滑动底部导航功能
2017/08/28 Javascript
vue-router的两种模式的区别
2019/05/30 Javascript
JavaScript设计模式之门面模式原理与实现方法分析
2020/03/09 Javascript
详解python单例模式与metaclass
2016/01/15 Python
Python数字图像处理之霍夫线变换实现详解
2018/01/12 Python
Django 根据数据模型models创建数据表的实例
2018/05/27 Python
python实现事件驱动
2018/11/21 Python
python 实现得到当前时间偏移day天后的日期方法
2018/12/31 Python
python输出决策树图形的例子
2019/08/09 Python
浅谈Django前端后端值传递问题
2020/07/15 Python
Django 用户认证Auth组件的使用
2020/11/30 Python
10个最常见的HTML5面试题 附答案
2016/06/06 HTML / CSS
百思买美国官网:Best Buy
2016/07/28 全球购物
诗普兰迪官方网站:Splendid
2018/09/18 全球购物
大学生演讲稿
2014/04/25 职场文书
投标承诺书怎么写
2014/05/24 职场文书
五一活动标语
2014/06/30 职场文书
房屋维修协议书范本
2014/09/25 职场文书
党员民主评议总结
2014/10/20 职场文书
商超业务员岗位职责
2015/02/13 职场文书
2016简单的租房合同范本
2016/03/18 职场文书