NodeJs捕获所有process.stdout到File

时间:2015-10-03 20:59:16

标签: node.js pipe stdout

我正在寻找一种方法来获取所有process.stdout并管道到日志文件,我有以下内容:

import fs from 'fs';
let logFile = fs.createWriteStream('./test.log', {
  encoding: 'utf8',
  flags   : 'a'
});
process.stdout.pipe(logFile);

但是,它似乎仍然向控制台吐出所有stdout,并且我没有在日志文件中获取任何内容(尽管它已被创建)。

2 个答案:

答案 0 :(得分:2)

我宁愿让程序写入stdout并让调用节点的进程决定如何处理输出:

node server | tee test.log

这有一些好处:

  • 不会将您的代码与您的日志记录基础架构相结合
  • 在您编写日志时不会锁定文件(例如,每当您想要旋转日志时,您都需要重新启动进程 - 对服务器不利)。

避免一个非常严重的缺点:

  • 您不必在应用程序中的某个其他位置对任何可能产生严重副作用的核心节点进行monkeypatch(或与另一个执行相同操作的库发生冲突)

答案 1 :(得分:0)

我认为这不起作用,因为process.stdout是一个无法通过管道传输的写入流,尽管我并不完全确定。我所做的工作是以下示例,其中我使用新的可写流覆盖stdout,该流具有_write方法,该方法调用文件流的write

var fs = require('fs');
var writeStream = fs.createWriteStream('./test.log', {
  encoding: 'utf8',
  flags: 'w'
});

process.stdout = require('stream').Writable();
process.stdout._write = function(chunk, encoding, callback) {
    writeStream.write(chunk, encoding, callback);
};

console.log('test from console.log');