[英]node.js automatic logging with metadata
我想創建一個Node.js記錄的裝飾器(函數過濾器),其工作方式如下(偽代碼警告):
logged = function(f) {
return function() {
log(f.file, f.line, f.class, f.name, arguments)
return f.call(this, arguments)
}
}
是否可以訪問上述信息? 我將要進行大量日志記錄,因此拋出一個虛假的Exception
並讀取跟蹤可能不可行(或者是嗎?)。
注意: f.class
是指保存prototype
的函數的名稱。 另外,我正在使用coffee-script
,以防萬一
您不必throw
異常, var stack = new Error().stack
就足夠了。 從那里可以解析出文件,行號和類名。 但是問題是,它僅跟蹤函數調用,因此現在要獲取裝飾函數的正確信息,應在函數或類中的某些位置初始化Error
。 在裝飾器中執行此操作,您只能獲取有關發生函數裝飾的文件/行號的信息,而不能獲得聲明函數的位置的信息。
function User(){}
User.prototype.foo = function(){};
User.stack_ = function(){
return new Error().stack
};
// ...
function wrapp(Ctor, name){
var stack = Ctor.stack_();
var info = parseStack(stack);
var orig_ = Ctor.prototype[name];
Ctor.prototype[name] = function(){
console.log('Info:', info);
return orig_.apply(this, arguments);
};
}
function parseStack(stack){
// implement better stacktrace parser
return stack.split('\n')[1];
}
// ...
wrapp(User, 'foo');
// ...
var user = new User;
user.foo();
// and you get smth. like
// Info: at Function.User.stack_ (filename:line:column)
我認為這是您可以獲得的最大值,您必須始終定義此stack_
函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.