简体   繁体   English

Java堆栈跟踪正则表达式

[英]Java stack trace regex

I need to match Java stack trace if it is a stack trace like this one 如果它是这样的堆栈跟踪,我需要匹配Java堆栈跟踪

Exception in thread "main" java.lang.IllegalStateException: A book has a null property
        at com.example.myproject.Author.getBookIds(Author.java:38)
        at com.example.myproject.Bootstrap.main(Bootstrap.java:14)
Caused by: java.lang.NullPointerException
        at com.example.myproject.Book.getId(Book.java:22)
        at com.example.myproject.Author.getBookIds(Author.java:36)

I can match it with ^[[:space:]]+(at|\\.{3})\\b|^Caused by: The problem is i need to match the entire stack trace and the traces i get look like this: 我可以用^[[:space:]]+(at|\\.{3})\\b|^Caused by:来匹配它。原因是:我需要匹配整个堆栈跟踪,而我得到的跟踪看起来像这样:

2019-06-14 15:07:08,142 ThreadPoolAsyncTaskExecutor::Thread 65 ERROR bamboo_user 906x78989x1 vg7ahz 192.168.181.28 /rest/plugins/1.0/bg.nemetschek.jsd.advance-customer-reports-key [o.e.g.b.e.i.dependencies.startup.DependencyWaiterApplicationContextExecutor] Unable to create application context for [bg.nemetschek.jsd.advance-customer-reports], unsatisfied dependencies: none
org.springframework.beans.factory.BeanDefinitionStoreException: Unexpected exception parsing XML document from URL [bundle://293.0:0/META-INF/spring/atlassian-plugins-component-imports.xml]; nested exception is java.lang.IllegalStateException: The bundle is uninstalled.
        at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:414)
        at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:336)
        at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:304)
        at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:181)
        at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:217)
        at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:188)
        at org.eclipse.gemini.blueprint.context.support.OsgiBundleXmlApplicationContext.loadBeanDefinitions(OsgiBundleXmlApplicationContext.java:170)
        at org.eclipse.gemini.blueprint.context.support.OsgiBundleXmlApplicationContext.loadBeanDefinitions(OsgiBundleXmlApplicationContext.java:140)
        at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:129)
        at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:609)
        at org.eclipse.gemini.blueprint.context.support.AbstractDelegatedExecutionApplicationContext.access$800(AbstractDelegatedExecutionApplicationContext.java:60)
        at org.eclipse.gemini.blueprint.context.support.AbstractDelegatedExecutionApplicationContext$3.run(AbstractDelegatedExecutionApplicationContext.java:242)
        at org.eclipse.gemini.blueprint.util.internal.PrivilegedUtils.executeWithCustomTCCL(PrivilegedUtils.java:85)
        at org.eclipse.gemini.blueprint.context.support.AbstractDelegatedExecutionApplicationContext.startRefresh(AbstractDelegatedExecutionApplicationContext.java:220)
        at org.eclipse.gemini.blueprint.extender.internal.dependencies.startup.DependencyWaiterApplicationContextExecutor.stageOne(DependencyWaiterApplicationContextExecutor.java:224)
        at org.eclipse.gemini.blueprint.extender.internal.dependencies.startup.DependencyWaiterApplicationContextExecutor.refresh(DependencyWaiterApplicationContextExecutor.java:177)
        at org.eclipse.gemini.blueprint.context.support.AbstractDelegatedExecutionApplicationContext.refresh(AbstractDelegatedExecutionApplicationContext.java:157)
        at org.eclipse.gemini.blueprint.extender.internal.activator.LifecycleManager$1.run(LifecycleManager.java:207)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.IllegalStateException: The bundle is uninstalled.
        at org.apache.felix.framework.Felix.getBundleResources(Felix.java:1624)
        at org.apache.felix.framework.BundleImpl.getResources(BundleImpl.java:661)
        at org.eclipse.gemini.blueprint.util.BundleDelegatingClassLoader.getResources(BundleDelegatingClassLoader.java:185)
        at org.springframework.core.io.support.PropertiesLoaderUtils.loadAllProperties(PropertiesLoaderUtils.java:177)
        at org.springframework.beans.factory.xml.DefaultNamespaceHandlerResolver.getHandlerMappings(DefaultNamespaceHandlerResolver.java:155)
        at org.eclipse.gemini.blueprint.extender.internal.support.NamespacePlugins$Plugin.resolve(NamespacePlugins.java:77)
        at org.eclipse.gemini.blueprint.extender.internal.support.NamespacePlugins$5.operate(NamespacePlugins.java:209)
        at org.eclipse.gemini.blueprint.extender.internal.support.NamespacePlugins$5.operate(NamespacePlugins.java:205)
        at org.eclipse.gemini.blueprint.extender.internal.support.LazyBundleRegistry.apply(LazyBundleRegistry.java:159)
        at org.eclipse.gemini.blueprint.extender.internal.support.NamespacePlugins.doResolve(NamespacePlugins.java:205)
        at org.eclipse.gemini.blueprint.extender.internal.support.NamespacePlugins.resolve(NamespacePlugins.java:169)
        ... 2 filtered
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.eclipse.gemini.blueprint.context.support.TrackingUtil$OsgiServiceHandler.invoke(TrackingUtil.java:106)
        at com.sun.proxy.$Proxy605.resolve(Unknown Source)
        at org.eclipse.gemini.blueprint.context.support.DelegatedNamespaceHandlerResolver.resolve(DelegatedNamespaceHandlerResolver.java:55)
        at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1406)
        at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1401)
        at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:168)
        at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.doRegisterBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:138)
        at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.registerBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:94)
        at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.registerBeanDefinitions(XmlBeanDefinitionReader.java:508)
        at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:392)
        ... 20 more

The actual problem is that ... 20 more or ... 2 filtered is not getting matched and i cant match the entire trace so i can take it as one string. 实际的问题是... 20 more... 2 filtered不匹配,我无法匹配整个轨迹,因此我可以将其作为一个字符串。

One option might be to match from a string starting with a date. 一种选择是从日期开始的字符串中进行匹配。 Then repeat all lines that do not start with a date or have at . 然后重复所有不以日期开头或at开头的行。 Then make sure to match at least 1 line with at and then match all lines untill the next date: 然后确保至少匹配1个行与at ,然后匹配所有行直到下一个日期:

^\d{4}-\d{2}-\d{2}.*(?:\n(?!(?:\d{4}-\d{2}-\d{2}|\h+at)).*)*\n\h+at\h+.*(?:\n(?!\d{4}-\d{2}-\d{2}).*)*

Explanation 说明

  • ^ Start of string ^字符串开头
  • \\d{4}-\\d{2}-\\d{2}.* Match a date like pattern followed by 0+ times any char except new line \\d{4}-\\d{2}-\\d{2}.*匹配日期(如模式),然后用0+乘除换行符以外的任何字符
  • (?: Non capturing group (?:非捕获组
    • \\n(?!(?:\\d{4}-\\d{2}-\\d{2}|\\h+at)).* match a newline, then assert what is on the right is not a datelike pattern or 1+ horizontal whitespace chars followed by at . \\n(?!(?:\\d{4}-\\d{2}-\\d{2}|\\h+at)).*匹配换行符,然后断言右边的内容不是类似日期的模式或1+个水平空格字符,后跟at If that is the case, match 0+ times any char except a newline 如果是这种情况,请匹配0+乘除换行符以外的任何字符
  • )* Close non capturing group and repeat 0+ times )*关闭非捕获组并重复0次以上
  • \\n\\h+at\\h+.* Match a line starting with at surrounded by 1+ horizontal whitespace chars \\n\\h+at\\h+.*匹配以at开头的行at并被1+个水平空格字符包围
  • (?:\\n(?!\\d{4}-\\d{2}-\\d{2}).*)* Match all lines not starting with a datelike pattern (?:\\n(?!\\d{4}-\\d{2}-\\d{2}).*)*匹配所有不以类似日期的模式开头的行

Regex demo 正则表达式演示

Note in Java to double escape the backslash: 请注意,在Java中要加倍转义反斜杠:

String regex = "^\\d{4}-\\d{2}-\\d{2}.*(?:\\n(?!(?:\\d{4}-\\d{2}-\\d{2}|\\h+at)).*)*\\n\\h+at\\h+.*(?:\\n(?!\\d{4}-\\d{2}-\\d{2}).*)*";

Try Regex: ^(?:Caused by:|\\s+(?:at|\\.{3})).*$ 试试正则表达式: ^(?:Caused by:|\\s+(?:at|\\.{3})).*$

Demo 演示

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM