我尝试用谷歌搜索解决它,但没有找到任何解决方案。 我必须解析日志行并从中提取字段值的映射。在日志行的某处也有日志行类型。 我需要返回一个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类来实现它。
有人可以建议一些方法吗?
答案 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}