将stdoutredirect到文件nodejs

我创造了:

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

然后pipe道:

 process.stdout.pipe(access); 

然后尝试:

 console.log("test"); 

并没有出现在/var/log/node/api.access.log。 但是,这种方式正在工作:

 process.stdout.pipe(access).write('test'); 

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

我用下面的方法解决了这个问题:

 var access = fs.createWriteStream('/var/log/node/api.access.log'); process.stdout.write = process.stderr.write = access.write.bind(access); 

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

我也强烈build议处理未捕获的exception:

 process.on('uncaughtException', function(err) { console.error((err && err.stack) ? err.stack : err); }); 

这将涵盖以下情况:

  • process.stdout.write
  • process.stderr.write
  • 的console.log
  • console.dir
  • console.error
  • someStream.pipe(process.stdout);
  • 抛出新的错误('崩溃');
  • 抛出“从不这样做”;
  • 扔undefined;

process.stdout是可写的。 pipeReadable的方法(Cf StreamAPI文档: https ://nodejs.org/api/stream.html

你可以在这里看到process.stdout的文档: https : //nodejs.org/api/process.html#process_process_stdout

令人惊讶的是,你可以做process.stdout.pipe(...); 没有任何错误。 但我想这个电话什么都不做。 除了返回绑定到stdout的新的Writablestream(或者返回process.stdout本身,在文档中没有这个规范)。

如果你想把stdoutredirect到一个文件,你有很多解决scheme:

  • 只需使用你的命令行来做到这一点。 Windows风格: node myfile.js > api.access.log
  • 用自己的对象replace控制台对象。 你可以重写控制台方法。
  • 我不确定,但也许可以用你自己的stream代替process.stdout (你可以用这个来做任何你想做的事情)

Checkout console.Console ,普通console的父类。

 var myLogFileStream = fs.createWriteStream(pathToMyLogFile); var myConsole = new console.Console(myLogFileStream, myLogFileStream); 

然后你可以使用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; 

根据将stdoutlogging到文件的动机,还有其他选项可以覆盖console._stdout