我想创建一个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
的适当信息,应该在函数或类的某个地方初始化。在decorator中这样做,您只能获得关于发生函数装饰的文件/linenumber的信息,而不是函数声明的位置。
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_
函数