【问题标题】:NodeJs Capture All process.stdout to FileNodeJs 将所有 process.stdout 捕获到文件中
【发布时间】:2015-10-03 20:59:15
【问题描述】:

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

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

但是,它似乎仍然将所有stdout 吐到控制台,并且我在日志文件中没有得到任何内容(尽管它正在创建中)。

【问题讨论】:

    标签: node.js pipe stdout


    【解决方案1】:

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

    node server | tee test.log

    这有几个好处:

    • 不会将您的代码耦合到您的日志记录基础架构
    • 在您写入日志时不锁定文件(例如,您需要在想要轮换日志时重新启动进程 - 对服务器不利)

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

    • 您不必对任何可能在应用程序的其他地方产生严重副作用(或与执行相同操作的其他库发生冲突)的核心节点内容进行monkeypatch

    【讨论】:

    • 同意。 node test.js > test.log 2>&1 在满足我的需要的随意编码时为我工作。
    【解决方案2】:

    我认为这不起作用,因为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');
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-27
      • 2012-10-21
      • 2011-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-25
      • 2020-07-23
      相关资源
      最近更新 更多