从 java 中的日志行获取字段值对,其中值在花括号中

Get field value pair from a log line in java where value is in curly braces

我尝试并用谷歌搜索来解决它,但没有找到任何解决方案。 我必须解析日志行并从中提取字段值映射。在日志行的某处也有日志行类型。 我需要 return 一个 Java 对象,它由日志行类型和字段值映射组成。

例如 - 假设下面的日志行:

Level {INFO} field1 {value1} field2 {value2} field3 {value3} field4 {value4} LOG_TYPE field5 {value5} field6 {value6} field7 {value7}

预期的输出应该是 java 以下 class 类型的对象:

class ParserResult {
    String logLineType;
    Map<String, String> fieldValueMap;
}

结果对象:

{
    logLineType = "LOG_TYPE",
    fieldValueMap = [{"Level":"INFO"}, {"field1":"value1"}, {"field2":"value2"}, {"field3":"value3"}, {"field4":"value4"}, {"field5":"value5"}, {"field6":"value6"}, {"field7":"value7"}]
}

java方法签名如下:

ParserResult parseLogLine(String logLine) {
    // parse log line and create ParserResult object
    return ParserResultObject;

}

我可以编写正则表达式来验证输入字符串,也可以使用字符串 class 方法提取字段值对,但对于我的用例来说效率不是很高,因为我必须这样做解析数千行日志。
可能有一些方法可以使用 Regex、Patterns 和 Matcher classes 在 java 中实现。 有人可以建议一些方法吗?

这是一些您可以用来读取日志文件和拆分字符串的示例。我不知道日志文件是否有某种模式,但如果没有,这可以解决你的问题。

import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class StackOver {

    public static void main(String[] args) {

        // Log File Content
        String LOG_FILE_CONTENT = "Level {INFO} field1 {value1} field2 {value2} field3 {value3} field4 {value4} LOG_TYPE field5 {value5} field6 {value6} field7 {value7}";

        // Regex
        String pattern = "([a-zA-Z0-9]+)(\s+)(\{[a-zA-Z0-9]+)(\})";
        Pattern p = Pattern.compile(pattern);
        Matcher m = p.matcher(LOG_FILE_CONTENT);

        // Mapper
        ParserResult pr = new ParserResult();
        pr.fieldValueMap = new HashMap<>();
        while(m.find()){
            String group = m.group();
            pr.fieldValueMap.put(group.split(" ")[0], group.split(" ")[1]);
        }

        pr.fieldValueMap.forEach((k, v) -> System.out.println(k + " -> " + v));
    }

}

class ParserResult {
    String logLineType;
    Map<String, String> fieldValueMap;
}

输出为:


    field5 -> {value5}
    field4 -> {value4}
    field7 -> {value7}
    field6 -> {value6}
    Level -> {INFO}
    field1 -> {value1}
    field3 -> {value3}
    field2 -> {value2}