Java 从日志文件解析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=

我想从日志文件中解析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={

    "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("}]", "}}]") + "}";
    }
}
注:

  • 标识日志行的正则表达式正在检查 这条线的起点。如果日志消息不正确,此操作将不起作用 跨越多行(例如,如果消息包含新行)
  • 有一种方法试图从日志文件中“修复”不完整的json,如果在此过程中出现更多不完整的json,则可能需要额外的逻辑
  • 我使用了Jackson Json解析器,让ObjectMapper确定要解析成什么样的数据结构

  • 你查过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个字符的错误。如果您发布完整的异常消息,我可以提供帮助