gpt4 book ai didi

node.js - 将 process.stdout 设置为每个 Node.js 核心集群工作线程的文件

转载 作者:太空宇宙 更新时间:2023-11-03 23:46:26 27 4
gpt4 key购买 nike

我正在尝试使用 Node 核心的集群功能。

我希望将 stdoutstderr 流输出到一个文件,每个工作 ID 对应一个文件。

类似于以下内容:

var fs          = require('fs'), 
env = process.env,
workerId = env.NODE_WORKER_ID || env.NODE_UNIQUE_ID;

process.stdout = fs.createWriteStream(__dirname + '/app#' + workerId + '.log', {
encoding: 'utf8'
});

不幸的是,它似乎没有像这样重写process.stdout。

有没有办法实现这一点,或者应该采取不同的方式?目前,当我运行集群时,我在一个控制台中获取所有进程的所有输出,这非常困惑。

最佳答案

我最终做了以下事情:

    //create a new stdout file stream
var stdoutFS = fs.createWriteStream(stdoutFile, {
encoding: 'utf8',
flags : 'a+'
});

//create a new stderr file stream
var stderrFS = fs.createWriteStream(stderrFile, {
encoding: 'utf8',
flags : 'a+'
});

//pipe stdout to a worker file
var unhookStdout = hookWriteStream(stdout, function(string, encoding, fd) {
stdoutFS.write(string, encoding || 'utf8');
});
console.log('\n\nPrepared new stdout hook to worker file.');

//pipe stderr to a worker file
var unhookStderr = hookWriteStream(stderr, function(string, encoding, fd) {
stderrFS.write(string, encoding || 'utf8');
});
console.log('Prepared new stderr hook to worker file.');

//unhook when things go wrong
stdoutFS.once('close', function() {
unhookStdout();
console.log('Unhooked stdout.');
});
stdoutFS.once('error', function(err) {
unhookStdout();
console.error('Error: Unhooked stdout due to error %j.', err);
});
stderrFS.once('close', function() {
unhookStderr();
console.log('Unhooked stderr.');
});
stderrFS.once('error', function(err) {
unhookStderr();
console.error('Error: Unhooked stderr due to error %j.', err);
});

});

function hookWriteStream(stream, callback) {
var oldWrite = stream.write;

stream.write = (function(write) {
return function(string, encoding, fd) {
write.apply(stream, arguments);
callback(string, encoding, fd);
};
})(stream.write);

return function() {
stream.write = oldWrite;
};
}

它可能不是很优雅,但到目前为止这是我找到的最好的解决方案。

关于node.js - 将 process.stdout 设置为每个 Node.js 核心集群工作线程的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10761879/

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