2015-10-04 27 views
2

我想重載sails.log函數,例如info,debug,error等,以包含打印日誌文件的路徑。例如,重載sails.log函數以包含源文件名,其中日誌來自

// api/controllers/UserController.js 

module.exports = { 

    create: function (req, res) { 
    // some operations 
    sails.log.info("created a new user"); 
    } 
} 

以上日誌聲明應打印

[api/controllers/UserController.js] info: created a new user 

我怎樣才能做到這一點?

回答

1

我對小膠質答案,https://gitter.im/balderdashy/sails#

張貼了同在這裏:

var winston = require('winston'); 

var getCaller = function() 
{ 
    var stack = getStack(); 
    stack.shift(); 
    var obj = stack[3]; 
    // Return caller's caller 
    return obj.getFileName(); 
}; 

var getStack = function() 
{ 
    // Save original Error.prepareStackTrace 
    var origPrepareStackTrace = Error.prepareStackTrace; 

    // Override with function that just returns `stack` 
    Error.prepareStackTrace = function (_, stack) 
    { 
    return stack; 
    }; 

    // Create a new `Error`, which automatically gets `stack` 
    var err = new Error(); 

    // Evaluate `err.stack`, which calls our new `Error.prepareStackTrace` 
    var stack = err.stack; 

    // Restore original `Error.prepareStackTrace` 
    Error.prepareStackTrace = origPrepareStackTrace; 

    // Remove superfluous function call on stack 
    stack.shift(); // getStack --> Error 

    return stack 
}; 


var customLogger = new winston.Logger({ 
    transports: [ 
    new(winston.transports.File)({ 
     level: 'debug', 
     filename: './logs/application.log' 
    }), 
    new (winston.transports.Console)({ 
     level: 'silly', 
     colorize: true, 
     timestamp: true 
    }) 
    ] 
}); 
customLogger.log = function(){ 
    var args = arguments; 
    args[1] = getCaller()+" - "+args[1]; 

    winston.Logger.prototype.log.apply(this,args); 
}; 
module.exports.log = { 
    colors: false, 
    custom: customLogger 
}; 
+0

這也可以讓你從堆棧中的函數名 –

1

覆蓋SailsJS記錄器是錯綜複雜的。 (https://github.com/balderdashy/sails/issues/2695

我結束了使用自己的記錄器。我只是創建了一個日誌服務。 Log.jsapi/services文件夾中。

在這個文件我

module.exports = { 
    e:function(message){ 
     //do other stuffs here 
     console.log(message); 
    } 
}; 

然後,我可以簡單地這樣做:

Log.e(message); 

要獲得腳本文件的名稱,你可以使用__filename。這將返回腳本/控制器的整個路徑,如下所示:

//console.log(__filename) 

/Users/blab/Desktop/SM/api/controllers/BrandController.js 

我希望這有助於!

相關問題