我现在正在研究一个基于集群的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