我現在正在研究一個基於集羣的node.js項目。我被卡在日誌中。在做了一些研究之後,我找出了一個解決方案。就這個。我不知道這是不是一個好主意。這個想法是這樣的。只有主進程可以寫入日誌文件,如果當前進程是工作者,則主進程會向主進程發送日誌消息,然後寫入日誌文件,而主進程可以直接寫入日誌文件。這可以避免多個進程打開並寫入同一個文件。node.js多進程日誌記錄
var util = require('util');
var fs = require('fs');
var cluster = require('cluster');
var logger = module.exports;
var levels = ['debug', 'info', 'warn', 'error', 'fatal'];
var logLevel = 'debug';
var logfile = null;
var errorLogfile = null;
if(cluster.isMaster){
logfile = fs.createWriteStream('debug.log', {flags:'a'});
errorLogfile = fs.createWriteStream('error.log', {flags:'a'});
cluster.on('online', function(worker){
//collect log message from child and write to logfile.
worker.on('message', function(msg){
if(msg.type == 'logging') {
var level = msg.data.level;
var logStr = msg.data.msg;
if(levels.indexOf(level) >= levels.indexOf('error')){
errorLogfile.write(logStr + '\n');
}else{
logfile.write(logStr + '\n');
}
}
});
});
}
function log(level, args){
if(levels.indexOf(level) < levels.indexOf(logLevel)) return;
var args = Array.prototype.slice.call(args);
args = args.map(function(a){
if(typeof a !== 'string')
return JSON.stringify(a);
else return a;
});
var msg = util.format.apply(null, args);
var out = [];
out.push(new Date());
out.push('[' + level.toUpperCase() + ']');
out.push(msg);
if(cluster.isMaster){
//write directly to the log file
if(levels.indexOf(level) >= levels.indexOf('error')){
errorLogfile.write(out.join(' ') + '\n');
}else{
logfile.write(out.join(' ') + '\n');
}
}else{
//send to master
cluster.worker.process.send({
type : 'logging',
data : {
level : level,
msg : out.join(' ')
}
});
}
}
logger.debug = function(){log('debug', arguments);}
logger.info = function(){log('info', arguments);}
logger.warn = function(){log('warn', arguments);}
logger.error = function(){log('error', arguments);}
logger.fatal = function(){log('fatal', arguments);}
我喜歡的日誌庫是[bunyan](https://www.npmjs.org/package/bunyan)。儘管如此,我還沒有使用它。 – clay