我想一个接一个地读取文件中所有新添加的行,就像读取数据流一样。到目前为止,我使用chokidar来接收该文件每次更新的通知,然后,我使用read-last-lines传递数字1
来指示我只想读取一行。
import fs from 'fs';
const readLastLines = require('read-last-lines');
import chokidar from 'chokidar';
const logFile = 'log.txt';
// first checks if its exist
if (fs.existsSync(logFile)) {
// then start watching on every update
chokidar.watch(logFile).on('change', (_event, _path) => {
// read each update
readLastLines.read(logFile, 1)
.then((line: string) => {
// do something with this received line.
// Can't receive two or three lines if sent instantaneously
doSomething(line);
}).catch((err :any) => {
console.log(err)
})
})
} else {
console.log('File Not Found')
}
我工作得很好,除了当我得到两个或三个更新的文件瞬间。在这种情况下,我只能得到这个序列的最后一行更新。我想可能是chokidar
有一个延迟在他的操作或我的操作系统是不允许文件正在写的另一个程序被读取,在同一时间由这个节点程序。
我想让它在终端上运行,如果它是一个程序输出(stdout)。(实际上,我的鼠标是用它来记录,从客户端,一个程序正在我的服务器上运行)。
1条答案
按热度按时间k5ifujac1#
可能有点晚了。有一个库可以让节点逐行处理类似日志的文件:tail
它的底层实现使用节点的
fs
库watch
和watchFile
来实现这一点。FYI:我会在您的代码中使用一个单独的文件来跟踪您已经处理了多少行,以提供
nLines
选项来实现崩溃恢复和一致性。