代码之家  ›  专栏  ›  技术社区  ›  Ramón J Romero y Vigil

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

  •  2
  • Ramón J Romero y Vigil  · 技术社区  · 8 年前

    给定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)
    

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

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

    grep "Exception" log.txt
    

    但我也想要所有随后的“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)
    

    提前感谢您的考虑和回应。

    2 回复  |  直到 8 年前
        1
  •  3
  •   revo shanwije    8 年前

    使用Java + 8,你可以做到:

    (?m)^.*?Exception.*(?:\R+^\s*at .*)+
    

    live demo here

    然而,在grep中,由于默认情况下它一次处理一行,因此可以将行与 Exception 或者那些以 at :

    grep -P '(?m)^(?:\S+?Exception|\h+at )' file
    
        2
  •  1
  •   Ed Morton    8 年前

    不要使用复杂的、不可移植的regexp,当您可以在任何UNIX机器上的任何shell中使用任何awk时:

    $ awk '/^[^ ]/{f=0} /Exception/{f=1} f' file
    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)