繁体   English   中英

从日志文件解析json对象

[英]parse json objects from a log file

我想从我的日志文件中解析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对象时,抛出异常。

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

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找出要解析为的数据结构

您是否研究过logstash( https://www.elastic.co/products/logstash )? 它可以解决此问题,以及可能在尝试解析日志时遇到的其他问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM