Как читать текстовый файл и группировать строки в узле JS синхронно - PullRequest
0 голосов
/ 01 июля 2018

Мне нужно синхронно прочитать файл журнала snort в узле js и разобрать их в данные JSON, чтобы я мог сохранить их в базе данных. Проблема в том, что файлы журналов фырканья - это не просто лайнеры. Предупреждение в snort состоит из 5 строк, и я бы хотел сохранить эти 5 строк как одно предупреждение в базе данных.

Я пытался использовать

     const rl = readline.createInterface({
            input: fs.createReadStream(LOG_FILE),
         });

         rl.on('line', (line) => {
         console.log(`Line from file: ${line}`);
         });

чтобы прочитать файл построчно и распечатать его, но он только распечатывает их построчно, и я не знаю, как их сгруппировать.

Вот пример файла журнала snort:

[**] [1:1000001:1] ICMP test [**]
[Classification: Generic ICMP event] [Priority: 3] 
06/09-14:18:58.102020 192.168.137.91 -> 192.168.137.89
ICMP TTL:64 TOS:0x0 ID:20610 IpLen:20 DgmLen:84 DF
Type:8  Code:0  ID:1664   Seq:5  ECHO

Так что в моей базе данных у меня будет что-то, называемое alert, и эти 5 строк будут предупреждены с id: 1 и так далее. Любая помощь будет оценена.

1 Ответ

0 голосов
/ 01 июля 2018

Соберите строки в переменной, а затем, как только вы получите полную запись, сделайте что-нибудь. Как это:

let lines = [];
rl.on('line', (line) => {
  lines.push(line);
  if (lines.length>=5) {
    let log = lines.splice(0,5).join('\n');
    console.log(log);
  }
});

Это считается в группах по 5 строк. Вы также можете использовать другие критерии, если хотите, например, сопоставление с образцом или что-то в этом роде.

ПРИМЕЧАНИЕ: Если вы используете совпадение с шаблоном в первой строке записи, вам нужно будет что-то сделать, чтобы проверить последний в файле (который не будет иметь другого). следуя за ним), например, прослушайте событие end потока и запишите оттуда последний logPart. (Но так как этот пример просто ожидает 5-ю строку, нам не нужно делать ничего особенного для обработки последней группы.)

...