使用节点将文件内容流式传输到标准输出
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); });
我的 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); });