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

时间:2018-04-23 16:51:49

标签: java regex matcher

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

对于前 - 假设下面的日志:

           public override void Up()
    {
        CreateTable(
            "dbo.Region",
            c => new
                {
                    Id = c.Int(nullable: false, identity: true),
                    OrganizationId = c.Int(nullable: false),
                    ParentRegionId = c.Int(nullable: false),
                    Name = c.String(nullable: false, maxLength: 255),
                })
            .PrimaryKey(t => t.Id)
            .ForeignKey("dbo.Organization", t => t.OrganizationId, cascadeDelete: true)
            .ForeignKey("dbo.Region", t => t.ParentRegionId)
            .Index(t => new { t.Id, t.OrganizationId }, name: "uqc_Region_OrganizationID")
            .Index(t => t.ParentRegionId);

    }

    public override void Down()
    {
        DropForeignKey("dbo.Region", "ParentRegionId", "dbo.Region");
        DropForeignKey("dbo.Region", "OrganizationId", "dbo.Organization");
        DropIndex("dbo.Region", new[] { "ParentRegionId" });
        DropIndex("dbo.Region", "uqc_Region_OrganizationID");
        DropTable("dbo.Region");
    }

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

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

结果对象:

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

java方法签名如下:

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

我能够编写正则表达式来验证输入字符串,并且还可以使用String类方法提取字段值对,但是对于我的用例来说效率不高,因为我必须解析数千个日志行。
可能有一些方法可以使用Regex以及java中的Patterns和Matcher类来实现它。 有人可以建议一些方法吗?

1 个答案:

答案 0 :(得分:1)

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

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}