从 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}
我尝试并用谷歌搜索来解决它,但没有找到任何解决方案。 我必须解析日志行并从中提取字段值映射。在日志行的某处也有日志行类型。 我需要 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}