簡體   English   中英

使用元數據自動記錄node.js

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM