首页 > 解决方案 > 使用节点将文件内容流式传输到标准输出

问题描述

我的 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));

标签: node.jsstreamfs

解决方案


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

您可以使用已经实现该功能的其中一个包:

使用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);
});

推荐阅读