Javascript 将log4j错误流解析为Node.js中的JSON

Javascript 将log4j错误流解析为Node.js中的JSON,javascript,json,node.js,parsing,log4j,Javascript,Json,Node.js,Parsing,Log4j,我正在使用以下shell命令(由node.js程序生成)来解析log4j日志文件中的错误: tail-F-n+0 LOGFILE.log | grep'ERROR\|^[:space:]*at'--before context=2 这将拾取其中包含“ERROR”的所有行,以及所有堆栈跟踪,前面的两行用于上下文 错误如下所示: 2014-10-15 01:55:12,402 [fault (self-tuning)'] [TABTHREAD7] [App:01.01.01] (Classinfo.

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

tail-F-n+0 LOGFILE.log | grep'ERROR\|^[:space:]*at'--before context=2

这将拾取其中包含“ERROR”的所有行,以及所有堆栈跟踪,前面的两行用于上下文

错误如下所示:

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)
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)"
};
我希望获取此数据流并对其进行解析,以便最终得到一个JSON对象,如下所示:

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)
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命令的stdout(stream),并希望解析传入的行,以便将它们转换为上述JSON格式。从我所读到的内容来看,似乎我应该在我的节点程序中编写一个处理器/解析器,它可以使用string.match(regex)并将这些块拉到我需要的属性下,使用类似于下面的概念:

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
我的节点代码如下(目前将数据写入文件以进行测试):

当文件只有一行,并且用所需的值填充myArray时,这种方法可以正常工作。然而,在处理流时,它失败得惊人。它给了我一堆介于两者之间的随机“null”值在处理流时,我如何才能达到同样的效果?我正在尝试流式处理大型日志文件(>1gb)

更新

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

    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”模块(),从中间文件一次读取一行。从性能的角度来看,这并不理想,但这是目前最好的选择。下面的代码似乎工作正常:

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));
     }

}))

你这里有很多问题。例如,>>“如何解析传入流并将其存储为JSON?”指定到目前为止您尝试了什么以及遇到了哪些问题是有意义的。否则问题就显得太模糊了。(可能有数千种方法可以达到预期的结果,因此只有概述您的具体问题才能帮助您)@Isantipov您是对的-让我们继续回答这个问题。“如何解析传入流并将其存储为JSON”。到目前为止,我已经尝试了以下方法:
var re=/(\w+)\s(\w+/;var str=“Shant-Want”;var myArray=str.match(re);var JSONStr={“名字”:myArray[1],“姓氏”:myArray[2]};console.log(JSON.stringify(JSONStr));//输出是{“First name”:“Shant”,“Last name”:“Want”}
我正在使用的正则表达式是
/(\d{4}-\d{2}-\d{2}-)(\d{2}:\d{2}:\d{2}-\d{3})(\[(.*)\(.*)\(.*)\s([^]*)(^]*)([^]*)(.*$/
在尝试使用流时,这里是代码。我在文件中得到一个奇怪的输出。[抱歉,在输入注释时,我正在努力在代码中显示换行符]
parseSh.stdout.on(“数据”,函数(数据){var str=data.toString();var re=/(\d{4}-\d{2}-\d{2})(\d{2}:\d{2}:\d{2}:\d{2}、\d{3})(\[(.*])\(([.*])\s+([^]*)*)([^-*)([^]*)([^*])([*])([^-=str array.-]match;myfs('myArray.txt',myArray,function(err){if(err)throw err;console.log(“它被保存了!”);});client.write(data);};
您最好将代码嵌入问题文本中,以便node.js专家可以看到并帮助您。此外,请概述问题所在(例如,您得到一个错误或只是您收到的结果与您认为应该的不匹配-然后指定,预期与实际的差异是什么)好的,进行了更改,谢谢!