我想在日志语句中显示文件名称
对于任何级别的每个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]