gpt4 book ai didi

javascript - 在 Node.js 中将 log4j 错误流解析为 JSON

转载 作者:太空宇宙 更新时间:2023-11-04 01:01:43 28 4
gpt4 key购买 nike

我正在使用以下 shell 命令(由我的 node.js 程序生成)来解析 log4j 日志文件中的错误:

tail -F -n +0 LOGFILE.log | grep '错误\|^[[:空格:]]*at' --before-context=2

这将拾取所有包含“ERROR”的行以及所有堆栈跟踪,并前面有 2 行作为上下文。

错误如下所示:

2014-10-15 01:55:12,402 [fault (self-tuning)'] [TABTHREAD7] [App:01.01.01] (Classinfo.Action)     ERROR stageinfo.company.com|11.222.33.444 userName - Error message telling us what went wrong
From: (unknown)
at ExceptionThrower.main(ExceptionThrower.java:21)
at ExceptionThrower.main(ExceptionThrower.java:22)
at ExceptionThrower.main(ExceptionThrower.java:23)
at ExceptionThrower.main(ExceptionThrower.java:24)
at ExceptionThrower.main(ExceptionThrower.java:25)

我想获取此数据流并解析它,以便最终得到如下所示的 JSON 对象:

JSONErrorObject = 
{
"Date" : "2014-10-15",
"Timestamp" : "01:55:12,402",
"Error" : "Error message telling us what went wrong",
"Stack Trace" : "at ExceptionThrower.main(ExceptionThrower.java:21)
at ExceptionThrower.main(ExceptionThrower.java:22)
at ExceptionThrower.main(ExceptionThrower.java:23)
at ExceptionThrower.main(ExceptionThrower.java:24)
at ExceptionThrower.main(ExceptionThrower.java:25)"
};

我正在读取 grep 命令的标准输出(流),并希望解析传入的行,以便将它们转换为上述 JSON 格式。从我读到的内容来看,我似乎应该在我的 Node 程序中编写一个处理器/解析器,它可以 string.match(regex) 并将这些 block 拉到我需要的属性下,使用类似于下面的概念:

var re = /(\w+)\s(\w+)/;
var str = "Shant Want";
var myArray = str.match(re);
var JSONStr = {
"First name" : myArray[1],
"Last name" : myArray[2]
};
console.log(JSON.stringify(JSONStr));

// Output is {"First name":"Shant","Last name":"Want"}

我使用的正则表达式是:

/(\d{4}-\d{2}-\d{2}) (\d{2}:\d{2}:\d{2},\d{3}) (\[(.*)\]) \((.*)\)\s+([^ ]*) ([^ ]*) ([^ ]*) - (.*)$/g

我的 Node 代码如下(暂时将数据写入文件以进行测试):

var spawn = require('child_process').spawn;
var net = require('fs');

var parseSh = spawn('sh', [ 'errorParser.sh' ]); //errorParser.sh has the one line parser - tail -F -n +0 LOGFILE.log | grep 'ERROR\|^[[:space:]]*at' --before-context=2
console.log("start tailing");

parseSh.stdout.on("data", function (data) {
var str = data.toString();
var re = /(\d{4}-\d{2}-\d{2}) (\d{2}:\d{2}:\d{2},\d{3}) (\[(.*)\]) \((.*)\)\s+([^ ]*) ([^ ]*) ([^ ]*) - (.*)$/g;
var myArray = str.match(re);
fs.appendFile('myArray.txt', myArray, function (err) {
if (err) throw err;
console.log("It's saved!");
});
});

当文件只有一行时,这可以正常工作,并且它会使用所需的值填充 myArray。然而,在处理流时,它会严重失败。它给了我一堆介于两者之间的随机“nullnullnullnullnullnullnull”值。 在使用流时如何实现相同的结果?我正在尝试流式传输巨大的日志文件 (> 1GB)。

更新

我只是使用“readline”模块( http://nodejs.org/api/readline.html )并从中间文件中一次读取一行。从性能的 Angular 来看,这并不理想,但它是我目前拥有的最好的。下面的代码似乎工作得很好。

    rl.on('line', function(line) {
console.log(line);
var str = line.toString();
var re = /(\d{4}-\d{2}-\d{2}) (\d{2}:\d{2}:\d{2},\d{3}) (.*ERROR) (.*) - (.*)/;

if(str.search(re) != -1){

var myArray = str.match(re);
var JSONErr = {
"Date": myArray[1],
"Time": myArray[2],
"Error": myArray[5]
};
client.write(JSON.stringify(JSONErr));
}
});

最佳答案

使用“readline”模块 ( http://nodejs.org/api/readline.html ),一次从中间文件中读取一行。从性能的 Angular 来看,这并不理想,但这是目前最好的选择。下面的代码似乎工作得很好:

rl.on('line', function(line) {
console.log(line);
var str = line.toString();
var re = /(\d{4}-\d{2}-\d{2}) (\d{2}:\d{2}:\d{2},\d{3}) (.*ERROR) (.*) - (.*)/;

if(str.search(re) != -1){

var myArray = str.match(re);
var JSONErr = {
"Date": myArray[1],
"Time": myArray[2],
"Error": myArray[5]
};
client.write(JSON.stringify(JSONErr));
}

});

关于javascript - 在 Node.js 中将 log4j 错误流解析为 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26393371/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com