2013-05-04 39 views
0

我正在構建一個可以由位於不同文件中的多個調用者調用的日誌記錄模塊。將函數導出到不同文件中的多個調用者

我的目標是在程序開始時初始化日誌文件,讓調用者只調用一個函數,記錄到之前初始化的文件,而無需再次進行整個初始化。

我不太明白模塊出口的概念,因此我希望你能幫上忙。

實際記錄發生在方法寫入上。在主要的app.js文件中,我可以啓動並記錄日誌。

但是,在另一個文件上,我對如何在不通過再次創建日誌文件的情況下只登錄到文件存在心理障礙。

var fs = require('fs'); 

var fd = {}, 
log = {}, 
debug = false; 

var tnlog = function(env, file, hostname, procname, pid) { 
    if (env == 'development') 
    debug = true; 

    fd = fs.createWriteStream(file, { flags: 'a', encoding: 'utf8', mode: 0644 }); 
    log = { hostname: hostname, procname: procname, pid: pid }; 
}; 

tnlog.prototype.write = function(level, str) { 
    if (debug) 
    console.log(str); 
    else { 
    log.timestamp = Date.now(); 
    log.level = level; 
    log.str = str; 
    fd.write(JSON.stringify(log) + '\n'); 
    } 
}; 

exports.tnlog = tnlog; 

這是我如何初始化和登錄的主文件:

var logfile = '/var/log/node/www/app.log'; 
var tnlog = require('./lib/tnlog').tnlog, 
    log = new tnlog(app.get('env'), logfile, os.hostname(), appname, process.pid); 

如果你可以建議做事情的一個更好的辦法,我一定會對此表示讚賞。

回答

0

編輯

最簡單的解決辦法是把

var logfile = '/var/log/node/www/app.log'; 
var tnlog = require('./lib/tnlog').tnlog, 
module.exports = new tnlog(app.get('env'), logfile, os.hostname(), appname, process.pid); 

到一個單獨的文件(mylogger.js),並要求任何你想要的東西記錄與logger = require "./mylogger.js。因爲節點會緩存導出的值,所以您總是會回到單個實例tnlog

我也看到你可能會使用快遞,所以你也可以做

app.set("logger",new tnlog(app.get('env'), logfile, os.hostname(), appname, process.pid))

和檢索它的任何地方,你有一個app.get("logger")參考的app對象。

更復雜:

您必須決定是否要支持日誌記錄到不同的文件相同的應用程序運行時。如果是這樣,你絕對需要爲每個日誌文件創建一個對象。您不必爲本身導出構造函數,也可以在工廠和單例模式之間導出一種混合。

您可以創建類似:

var loggers = {} 
module.exports = function getLogger(env, file, hostname, procname, pid) { 
    key = env + file + hostname + procname + pid) 
    if(loggers[key]) return loggers[key] 
    return loggers[key] = new Logger(env, file, hostname, procname, pid) 
} 

即您可以根據連接函數參數變量來檢查是否已經創建了記錄器對象。

然後你需要創建一個合適的Logger構造函數,當然,我假設你知道一些Javascript。

請注意,loggers對象將保持私有變量,就像Logger構造函數一樣。因爲節點。js緩存模塊導出的對象,loggers對象的值將持續多次調用require,作爲getLogger閉包的一部分。

相關問題