匹配整个 Java 异常堆栈跟踪的正则表达式

Ram*_*gil 3 java regex logging grep

给定一个 Java 应用程序的标准日志文件:

 INFO [main] (AutoMain.java:133) - querying data 1
DEBUG [main] (AutoMain.java:142) - data 1 count: 23180
 INFO [main] (AutoMain.java:151) - querying data 2
ERROR [main] (AutoMain.java:607) - Failure in auto
java.net.ConnectException: Connection refused (Connection refused)
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
    at java.net.Socket.connect(Socket.java:589)
    at java.net.Socket.connect(Socket.java:538)
    at java.net.Socket.<init>(Socket.java:434)
    at java.net.Socket.<init>(Socket.java:211)
    at com.myCompany.client.ClientIOFactory$1.<init>(ClientIOFactory.java:17)
    at com.myCompany.client.ClientIOFactory.lambda$clientIOFactoryFromSocket$0(ClientIOFactory.java:15)
    at com.myCompany.client.queryData(Client.java:83)
    at com.myCompany.client.queryData(Client.java:91)
    at com.myCompany.queryOptData(InstantAutomaton.java:153)
    at com.myCompany.AutoMain.main(InstantAutomaton.java:426)
Run Code Online (Sandbox Code Playgroud)

什么是匹配任何 java 的整个堆栈跟踪的正则表达式Exception

匹配任何包含“Exception”的单行很容易:

grep "Exception" log.txt
Run Code Online (Sandbox Code Playgroud)

但我也想要所有随后的“at”语句。所以结果匹配的字符串应该是:

java.net.ConnectException: Connection refused (Connection refused)
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
    at java.net.Socket.connect(Socket.java:589)
    at java.net.Socket.connect(Socket.java:538)
    at java.net.Socket.<init>(Socket.java:434)
    at java.net.Socket.<init>(Socket.java:211)
    at com.myCompany.client.ClientIOFactory$1.<init>(ClientIOFactory.java:17)
    at com.myCompany.client.ClientIOFactory.lambda$clientIOFactoryFromSocket$0(ClientIOFactory.java:15)
    at com.myCompany.client.queryData(Client.java:83)
    at com.myCompany.client.queryData(Client.java:91)
    at com.myCompany.queryOptData(InstantAutomaton.java:153)
    at com.myCompany.AutoMain.main(InstantAutomaton.java:426)
Run Code Online (Sandbox Code Playgroud)

预先感谢您的考虑和回应。

rev*_*evo 5

使用 Java +8 你可以这样做:

(?m)^.*?Exception.*(?:\R+^\s*at .*)+
Run Code Online (Sandbox Code Playgroud)

在此处查看现场演示

然而,在 grep 中,由于默认情况下它一次处理一行,您可以匹配以下行Exception或以以下开头的行at

grep -P '(?m)^(?:\S+?Exception|\h+at )' file
Run Code Online (Sandbox Code Playgroud)