解析日志文件中的json对象

时间:2015-10-22 13:50:29

标签: java json

我想解析日志文件中的JSON对象。对于使用JSON Parser,我的完整文件必须是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对象时。

2 个答案:

答案 0 :(得分:0)

这是一个适用于发布的示例日志的解决方案。

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

注意:

  1. 标识日志行的正则表达式正在检查时间戳 开始了。如果日志消息,这将不起作用 跨越多行(例如,如果消息包含新行)
  2. 有一种方法试图从日志文件中“修复”不完整的json,如果沿途有更多json不完整的情况,可能需要额外的逻辑
  3. 我使用了Jackson Json解析器,让ObjectMapper找出要解析的数据结构

答案 1 :(得分:0)

您是否查看了logstash(F.17: Use a not_null to indicate that "null" is not a valid value)?它可以解决此问题以及尝试解析日志时遇到的其他问题。