Java 从日志文件解析json对象
我想从日志文件中解析JSON对象。为了使用JSON解析器,我的完整文件必须采用JSON格式,而我的情况并非如此。是否有任何方法可以逐行解析文件并获取JSON对象。 以下是我的日志文件格式:Java 从日志文件解析json对象,java,json,Java,Json,我想从日志文件中解析JSON对象。为了使用JSON解析器,我的完整文件必须采用JSON格式,而我的情况并非如此。是否有任何方法可以逐行解析文件并获取JSON对象。 以下是我的日志文件格式: 2015-10-19 11:24:35:701 INFO BrokerTcpClient:28 - Set destination 2015-10-19 11:24:35:929 DEBUG BrokerTcpClient:32 - received data: {type=data, payload=
2015-10-19 11:24:35:701 INFO BrokerTcpClient:28 - Set destination
2015-10-19 11:24:35:929 DEBUG BrokerTcpClient:32 - received data: {type=data, payload={
"core" : [ {
"id" : {
"datatype" : "http://www.w3.org/2001/hk#long",
"type" : "gh",
"value" : "gh"
},
"entity" : {
"type" : "uri",
"value" : "http://fg.fg.com/ext/g/fg"
},
"Sno" : {
"type" : "literal",
"value" : "fg"
}]
2015-10-19 11:24:35:701 INFO BrokerTcpClient:28 - Set destination
2015-10-19 11:24:35:929 DEBUG BrokerTcpClient:32
"core" : [ {
"id" : {
"datatype" : "http://www.w3.org/2001/hk#long",
"type" : "gh",
"value" : "gh"
},
"entity" : {
"type" : "uri",
"value" : "http://fg.fg.com/ext/g/fg"
},
"Sno" : {
"type" : "literal",
"value" : "fg"
}]
任何人都可以帮助我如何获取JSON对象。当我试图解析一行抛出异常的JSON对象时。下面是一个适用于发布的示例日志的解决方案
import java.io.*;
import com.fasterxml.jackson.databind.*;
public class JSONTest {
public static void main(String[] args) {
String logFilename = "C://Temp/sample.log";
String line, json = "";
try (BufferedReader br = new BufferedReader(new FileReader(logFilename))) {
while ((line = br.readLine()) != null) {
if (isLogLine(line)) {
if (!json.isEmpty()) {
parseJson(json);
json = "";
}
} else {
json += line;
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static boolean isLogLine(String line) {
return line.matches("^\\d{4}\\-\\d{2}\\-\\d{2}\\s\\d{2}:\\d{2}:\\d{2}:\\d{3}.+$");
}
public static void parseJson(String json) throws Exception {
if (!json.startsWith("{") && !json.endsWith("}")) json = "{" + json + "}";
ObjectMapper om = new ObjectMapper();
System.out.println(om.readValue(fixJson(json), Object.class));
}
public static String fixJson(String json) {
return "{" + json.replace("}]", "}}]") + "}";
}
}
注:
你查过logstash()了吗?它可以解决这个问题,也可能解决您在尝试解析日志时遇到的其他问题。日志具有特定的格式,因此您只需去掉您不关心的内容:YYYY-MM-DD HH:MM:SS:mmm:抱歉,我没有理解您的意思。。我所理解的是逐行阅读。。我在哪里找到数据来存储在任何集合中?请指导我,如果我是错误的,甚至剥离时间戳日志数据,您的示例中的json是无效的。在第一个“json”中有1个未关闭的{,因此您不仅需要解析出尝试的json,还需要关闭未关闭的{or}[.您可以遍历每一行,如果当前行不是以时间戳开始的,而最后一行则假定当前行是json对象的一部分,并继续向对象字符串添加行,直到找到另一个时间戳,然后将该对象包装在{}为了使其有效jsonSorry这是我的复制粘贴错误。json对象在带有完整大括号的日志文件中也是有效的。因此,我应该在一个字符串对象中添加一个json对象,并使用json解析器对其进行解析。我将尝试它。但是我的日志文件非常大,所以我尝试了避免这种方法。能够将json对象从日志文件分离到一个stri中ng,但当我尝试使用JSONParser解析它时,出现了异常:“8处的意外令牌”;原因是。我没有得到这不是json正确的格式。请帮助。这就是为什么我特意创建了
fixJson()
方法,以便您可以“播放”使用字符串,并在解析之前修复它。完整的异常消息包含json输入,因此您可以查看第8个字符的错误。如果您发布完整的异常消息,我可以提供帮助