我想在Servlet failed with Exception java.lang.NullPointerException之后打印所有堆栈跟踪。我也使用了.contains("Servlet failed with Exception"),但这并不总是有效的,因为很少的NPE没有堆栈跟踪。请帮帮我!!
public class PatternMatching {
public static final String EXAMPLE_TEST = "<Jul 5, 2017 4:14:28 PM GMT> <Error> <HTTP> <BEA-101020> <[ServletContext@1215989071[app:CeCBS module:/shop path:/shop spec-version:2.5]] "+
"Servlet failed with Exception" +
"java.lang.NullPointerException" +
"at xyz.commerce.catalog.CatalogAccessTools.findLeadItemByBundleSku(CatalogAccessTools.java:770)" +
"at xyz.commerce.catalog.PerformanceMonitoringUKCatalogAccessTools.findLeadItemByBundleSku(PerformanceMonitoringUKCatalogAccessTools.java:436)"+
"at xyz.commerce.catalog.CatalogAccessTools.findLeadItemByBundleSku(CatalogAccessTools.java:760)"+
"at xyz.commerce.catalog.PerformanceMonitoringUKCatalogAccessTools.findLeadItemByBundleSku(PerformanceMonitoringUKCatalogAccessTools.java:426)"+
"at xyz.commerce.catalog.controller.PlansListingController.setChooseAPlan(PlansListingController.java:1505)"+
"Truncated. see log file for complete stacktrace " ;
public static void main(String[] args) {
String Regex = "^Servlet failed with Exception.*\\bat\\b.*";
Pattern p = Pattern.compile(Regex);
Matcher m = p.matcher(EXAMPLE_TEST);
if(m.find())
{
System.out.println("Print succesfull");
//System.out.println(m.start());
//System.out.println(matcher);
}
else
{
System.out.println("Print unsuccesfull");
}
}
}它应该只打印唯一堆栈跟踪
at xyz.commerce.catalog.CatalogAccessTools.findLeadItemByBundleSku(CatalogAccessTools.java:770)
at xyz.commerce.catalog.PerformanceMonitoringUKCatalogAccessTools.findLeadItemByBundleSku(PerformanceMonitoringUKCatalogAccessTools.java:436)
at xyz.commerce.catalog.CatalogAccessTools.findLeadItemByBundleSku(CatalogAccessTools.java:760)
at xyz.commerce.catalog.PerformanceMonitoringUKCatalogAccessTools.findLeadItemByBundleSku(PerformanceMonitoringUKCatalogAccessTools.java:426)"+
at xyz.commerce.catalog.controller.PlansListingController.setChooseAPlan(PlansListingController.java:1505)发布于 2017-08-04 23:10:36
我认为最重要的是要知道,为了让.匹配换行符,您需要使用Pattern.Compile函数的Pattern.DOTALL参数。然而,在这种情况下,您可能无法在单词“Servlet”之前使用^ (我记不清了,所以您可以乱弄它),因为它可能与行的开头不匹配。除此之外,我个人可能会使用\\S+ (注意大写的“S”)来捕获异常类型,它匹配一组1个或多个非空格字符。作为一个整体,我会建议
String regex = "Servlet failed with Exception\\s+\\S+\\s+(.*)$"
Pattern p = Pattern.compile(regex, Pattern.DOTALL);运行m.find()后,有关错误的数据将在matcher对象的匹配组1中找到。
我要指出的是,这在您的示例中不起作用,因为您没有在几个连接字符串之间包含空格,但它应该在实际输出上起作用。
发布于 2017-08-04 23:26:50
发布于 2017-08-04 22:34:18
您可以尝试在"java.lang.NullPointerException"上拆分
String whatYouWant = EXAMPLE_TEST.split("java\\.lang\\.NullPointerException")[1];
Demo
这是一种快速、肮脏的方法,似乎满足了您的需求。更好的方法是使用正则表达式来提取堆栈跟踪的每一行:
String pattern = "at .*?\\(.*?\\)";
Pattern r = Pattern.compile(pattern, Pattern.DOTALL);
Matcher m = r.matcher(EXAMPLE_TEST);
StringBuilder sb = new StringBuilder("");
while (m.find()) {
sb.append(m.group(0)).append("\n");
}
System.out.println(sb);
Demo
请注意,我将regex模式调优为实际的堆栈跟踪字符串,这可能不是您实际要解析的字符串。更好的模式应该是这样的:
String pattern = "\\bat .*?\\(.*?\\)";在每一行的开头匹配at会更安全。
https://stackoverflow.com/questions/45509337
复制相似问题