使用节点将文件内容流式传输到标准输出

Using node to stream file contents to stdout

我的 NodeJS 应用程序使用 pino 进行基于 JSON 的日志记录。 Pino 将日志文件发送到标准输出。我只是使用 ./app.js >> filename.log 将输出保存到一个文件中。我想设置一个小脚本,它将不断流式传输日志文件,类似于尾部的 -f 标志。我不希望应用程序在到达文件末尾时退出,而是等待流式传输其他数据。我可以让文件回显到标准输出,但是一旦到达文件末尾它就不会继续流。

const fs = require('fs');
const split = require('split2')
const pump = require('pump')

// Attempt 1 
fs.createReadStream(file)
  .pipe(split(JSON.parse))
  .on('data', function (obj) {
    console.log(obj);
  })

pump(process.stdout, streamToElastic);

// Attempt 2
const readStream = fs.createReadStream(logFileLocation);
pump(readStream.pipe(process.stdout), split(JSON.parse));

您必须自己实现它,因为内置流不提供该功能,您必须监视文件更改或轮询文件。

您可以使用已经实现该功能的软件包之一:

使用tail

Tail = require('tail').Tail;

tail = new Tail("fileToTail");

tail.on("line", function(data) {
  console.log(data);
});

tail.on("error", function(error) {
  console.log('ERROR: ', error);
});

与接受的答案相反,这对我来说效果很好:

const fs = require('fs');
const process = require('process');

lf = fs.createReadStream(tailfile);
lf.on('open', () => { lf.pipe(process.stdout); });