Подтвердить что ты не робот

Как выполнить обработку `tail -f logfile.txt` в node.js?

tail -f logfile.txt выводит последние 10 строк файла logfile.txt, а затем продолжает выводить добавленные данные по мере роста файла.

Какой рекомендуемый способ сделать часть -f в node.js?

Далее выводится весь файл (игнорируется "показывать последние 10 строк" ), а затем завершается.

var fs = require('fs');
var rs = fs.createReadStream('logfile.txt', { flags: 'r', encoding: 'utf8'});
rs.on('data', function(data) {
  console.log(data);
});

Я понимаю, что цикл событий завершается, потому что после события завершения потока и закрытия события больше нет событий - мне любопытно, как лучше продолжать мониторинг потока.

4b9b3361

Ответ 1

Канонический способ сделать это - fs.watchFile.

В качестве альтернативы вы можете просто использовать node -tail module, который использует fs.watchFile внутри себя и уже выполнил эту работу для вас. Вот пример использования его прямо из документации:

Tail = require('tail').Tail;

tail = new Tail("fileToTail");

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

Ответ 2

node.js Документация APi на fs.watchFile указывает:

Стабильность: 2 - Нестабильно. Вместо этого используйте fs.watch, если доступно.

Забавно, что он говорит почти то же самое для fs.watch:

Стабильность: 2 - Нестабильно. Не доступен на всех платформах.

В любом случае, я пошел вперед и сделал еще один небольшой webapp, TailGate, который закроет ваши файлы с помощью варианта fs.watch.

Не стесняйтесь проверить здесь: TailGate on github.

Ответ 3

вы можете попытаться использовать fs.read вместо ReadStream

var fs = require('fs')

var buf = new Buffer(16);
buf.fill(0);
function read(fd)
{
    fs.read(fd, buf, 0, buf.length, null, function(err, bytesRead, buf1) {
        console.log(buf1.toString());
        if (bytesRead != 0) {
            read(fd);
        } else {
            setTimeout(function() {
                read(fd);
            }, 1000);
        }
    }); 
}

fs.open('logfile', 'r', function(err, fd) {
    read(fd);
});

Обратите внимание, что чтение вызывает обратный вызов, даже если нет данных, и он просто дошел до конца файла. Без тайм-аута вы получите 100% -ный процессор здесь. Вы можете попытаться использовать fs.watchFile для немедленного получения новых данных.

Ответ 4

Substack имеет фрагмент файла, который ведет себя точно так же, как tail -f, slice файл может обновлять поток после начального фрагмента из 10 строк.

var sf = require('slice-file');

var xs = sf('/var/log/mylogfile.txt');
xs.follow(-10).pipe(process.stdout);

Источник: https://github.com/substack/slice-file#follow

Ответ 5

https://github.com/jandre/always-tail кажется отличным вариантом, если вам нужно беспокоиться о вращении логов, например, из файла readme:

var Tail = require('always-tail');
var fs = require('fs');
var filename = "/tmp/testlog";

if (!fs.existsSync(filename)) fs.writeFileSync(filename, "");

var tail = new Tail(filename, '\n');

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


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

tail.watch();