如何在节点js中同步读取文本文件和将行分组在一起

时间:2018-07-01 16:09:10

标签: javascript node.js file-io synchronous

我需要同步读取node js中的snort日志文件,并将它们解析为JSON数据,以便可以将它们存储在数据库中。问题是,snort日志文件不仅仅是一个衬纸。 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 :(得分:0)

收集变量中的行,然后在获得完整条目后立即执行操作。像这样:

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行,因此我们不必做任何特殊的处理最后一个组。)