gpt4 book ai didi

node.js 多进程日志记录

转载 作者:搜寻专家 更新时间:2023-11-01 00:32:43 24 4
gpt4 key购买 nike

我现在正在做一个基于集群的node.js项目。我被困在日志记录上了。在做了一些研究之后,我制定了一个解决方案。就这个。我不知道这是不是个好主意。思路是这样的。只有master进程可以写入日志文件,如果当前进程是worker,则发送日志消息给master,然后写入日志文件,而master可以直接写入日志文件。这可以避免多个进程打开并写入同一个文件。

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);}

最佳答案

  1. 它一定有瓶颈问题,因为主服务器是唯一可以将 n 个工作人员的消息记录到文件中的地方。 master 和 worker 之间不需要通信,因为 worker 可以直接将消息写入文件。只要消息长度小于管道缓冲区,写入操作就是安全的。

  2. 您没有处理“流失”事件。当您有大量消息需要记录时,流缓冲区很容易变满,因为流没有足够的时间刷新缓冲区并将缓冲区写入磁盘。同时,您不断将消息放入缓冲区。最后,您无法将消息完全记录到文件中。刷新缓冲区时将触发“drain”事件。 “drain”的详细信息请引用“http://nodejs.org/api/stream.html#stream_event_drain

附言如果你有时间,请试试我的库。它侧重于多进程日志记录和日志轮换。而且它在文件记录方面非常非常快并且内存消耗小 https://github.com/wood1986/ln

关于node.js 多进程日志记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23339732/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com