将stdout重定向到文件nodejs

Sup*_*ion 16 logging stdout node.js

我创造了:

var access = fs.createWriteStream('/var/log/node/api.access.log', { flags: 'w' });
Run Code Online (Sandbox Code Playgroud)

然后管道:

process.stdout.pipe(access);
Run Code Online (Sandbox Code Playgroud)

然后尝试:

console.log("test");
Run Code Online (Sandbox Code Playgroud)

并且/var/log/node/api.access.log中没有出现任何内容.但是这种方式有效:

process.stdout.pipe(access).write('test');
Run Code Online (Sandbox Code Playgroud)

有人可以解释我做错了什么吗?

小智 24

我通过以下方式解决了这个问题:

var access = fs.createWriteStream('/var/log/node/api.access.log');
process.stdout.write = process.stderr.write = access.write.bind(access);
Run Code Online (Sandbox Code Playgroud)

当然,如果你愿意,你也可以分开stdout和stderr.

我也强烈建议处理未捕获的异常:

process.on('uncaughtException', function(err) {
  console.error((err && err.stack) ? err.stack : err);
});
Run Code Online (Sandbox Code Playgroud)

这将涵盖以下情况:

  • process.stdout.write
  • process.stderr.write
  • 的console.log
  • console.dir
  • console.error
  • someStream.pipe(process.stdout);
  • 抛出新错误('崩溃');
  • 扔'永远不要这样';
  • 扔未定义;

  • 厌倦了如果您要覆盖`process.stdout.write`,则无法再写入控制台。 (2认同)

ric*_*gle 7

Checkout console.Console,父类正常console

var myLogFileStream = fs.createWriteStream(pathToMyLogFile);

var myConsole = new console.Console(myLogFileStream, myLogFileStream);
Run Code Online (Sandbox Code Playgroud)

然后您可以使用myConsole.logmyConsole.errormyConsole.dir等并直接写入您的文件。

您还可以按如下方式进行猴子补丁 process.stdout.write

var fn = process.stdout.write;

function write() {
  fn.apply(process.stdout, arguments);
  myLogFileStream.write.apply(myLogFileStream, arguments);
}

process.stdout.write = write;
Run Code Online (Sandbox Code Playgroud)

console._stdout根据记录stdout到文件的动机,还有其他覆盖选项。