我想在日志语句中显示文件名称

对于任何级别的每个logging器语句,我需要显示执行日志语句的文件名,下面是我给出的例子:

例如:下面是从JobWork.js执行的行

logger.info("getInCompleteJobs in job works"); 

实际:

 2012-11-05T06:07:19.158Z - info: getInCompleteJobs in job works 

要求:

 2012-11-05T06:07:19.158Z - info JobWork.js : getInCompleteJobs in job works 

如果不从log语句中传递fileName作为参数,它应该提供文件名。

您可以使用附加到v8的Error对象的堆栈跟踪信息来找出您的代码被调用的文件/行。 这种方法运作良好,但performance不佳; 所以如果你在开发过程中使用它,你会想要在生产时禁用它。

所以你可以做这样的事情:

  var logger_info_old = logger.info; logger.info = function(msg) { var fileAndLine = traceCaller(1); return logger_info_old.call(this, fileAndLine + ":" + msg); } /** * examines the call stack and returns a string indicating * the file and line number of the n'th previous ancestor call. * this works in chrome, and should work in nodejs as well. * * @param n : int (default: n=1) - the number of calls to trace up the * stack from the current call. `n=0` gives you your current file/line. * `n=1` gives the file/line that called you. */ function traceCaller(n) { if( isNaN(n) || n<0) n=1; n+=1; var s = (new Error()).stack , a=s.indexOf('\n',5); while(n--) { a=s.indexOf('\n',a+1); if( a<0 ) { a=s.lastIndexOf('\n',s.length); break;} } b=s.indexOf('\n',a+1); if( b<0 ) b=s.length; a=Math.max(s.lastIndexOf(' ',b), s.lastIndexOf('/',b)); b=s.lastIndexOf(':',b); s=s.substring(a+1,b); return s; } 

看起来你在这里使用Winston – 我通常将module传递到我的logging器模块,然后将Winston的label属性设置为parsing版本的module.filename 。 就像是:

logger.js:

 // Return the last folder name in the path and the calling // module's filename. var getLabel = function() { var parts = callingModule.filename.split('/'); return parts[parts.length - 2] + '/' + parts.pop(); }; module.exports = function(callingModule) { return new winston.Logger({ transports: [new winston.transports.Console({ label: getLabel() })] }); }; 

用法(假设模块是controllers/users.js ):

 var logger = require('./logger')(module); logger.info('foo'); 

结果:

 2014-11-25T15:31:12.186Z - info: [controllers/users.js] foo 

假设每个文件是一个独立的节点进程,你可以使用像process.argv[1].match(/[\w-]+\.js/gi)[0]

如果你正在寻找可以在模块中工作的东西,这可能会工作:

 process.mainModule.filename.match(/[\w-]+\.js/gi)[0]