javascript - 如何在node js中同步读取文本文件并将行组合在一起
问题描述
我需要在 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 行将是 alert,id:1 等等。任何帮助将不胜感激。
解决方案
将行收集到一个变量中,然后在获得完整条目后执行某些操作。像这样:
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 行,我们不需要做任何特别的事情来处理最后一组。)
推荐阅读
- javascript - HTML中拖放行时如何使行号自动调整
- django - 如何在 Django 中添加指向引导导航栏的链接?
- azure - 创建 Azure 管道
- java - 日历不考虑时区偏移
- c - C中的一个简单makefile - 与C文件名称不同的对象文件
- ruby - 如何在 ruby 中创建 Hash:ActiveSupport
- javascript - 有没有办法将任何排序方法实现为生成器函数(JavaScript)?
- sql - Oracle SQL 使用子查询获取递归级别
- android - android studio kotlin - 蓝牙“ACTION REQUEST ENABLE”不起作用
- rest - In Sabre - 酒店列表休息 API