2016-01-25 20 views
0

從日誌文件中讀取特定的堆棧跟蹤我讀使用BufferedReader一個日誌文件,我想提取從日誌文件中的特定堆棧跟蹤。但是,我無法讀取它,輸出是空的。模式在Java

,比如我有這個詞例外:客戶 和堆棧跟蹤它是這樣的:

值java.sql.SQLException:在「字段列表」

未知列「客戶」

SELECT查詢

在com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2928)處 com.mysql.jdbc com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1571)。 MysqlIO.sqlQueryDirect(MysqlIO.java:1666),地址爲 com.mysql.jdbc.Connection.execSQL(Connection.java:2994)在 com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:936) 在 com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement的。 java:1030) at telemed.admin.DAO.AdminDAO.getTeleVisitorData(AdminDAO.java:87)at telemed.admin.AdminService.getTeleVisitors(AdminService.java:31)at org.apache.jsp.jsp.telemed。 telemedResponse_jsp._jspService(telemedResponse_jsp.java:330) 在org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) 在javax.servlet.http.HttpServlet.service(HttpServlet.java:728)在 org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432) 在 org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390) at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334) at javax.servlet.http.HttpServlet.service (HttpServlet.java:728)在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 在 org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)

我想讀的堆棧跟蹤它在一個特定的詞,但沒有異常線。

我的代碼是:

BufferedReader br=new BufferedReader(new FileReader("E:/exp.txt")); 
String temp; 
Pattern expPattern=Pattern.compile("(?s).*Exception:.*client.*[\\n\\r].*"); 

while((temp=br.readLine())!=null){ 
    //System.out.println("line::::"+temp); 
    Matcher headlineMatcher=expPattern.matcher(temp); 
    if(headlineMatcher.find()){ 
     System.out.println("=>"+temp); 
     temp=null; 
    } 
} 
+0

您需要哪行extact? – AlexBay

+0

這整個異常堆棧trace.it包含「客戶端」 –

+0

正則表達式夥伴顯示您的模式作爲匹配。我不得不猜測它是關於java代碼,特別是關於如何處理模式結果,或許不是模式本身。 –

回答

1

與方法的問題是,readLine()返回線沒有任何字符lineend。所以你無法匹配他們。

一個可能的解決方案是相匹配的第一行,並打印以下行的固定數量或直到找到可以認定爲您感興趣的最後一行一條線。

取片段作爲簡單的演示。

Pattern expPattern = Pattern.compile("(?s).*Exception:.*client.*"); 
int followingLines = 4; 

try (BufferedReader br = Files.newBufferedReader(Paths.get("exp.txt"), UTF_8)) { 
    for (String line = br.readLine(); line != null; line = br.readLine()) { 
     if (expPattern.matcher(line).find()) { 
      System.out.println("=>" + line); 
      for (int i = 0; i < followingLines; i++) { 
       line = br.readLine(); 
       if (line == null) { 
        break; 
       } 
       System.out.println("=>" + line); 
      } 
     } 
    } 
} catch (IOException ex) { 
    ex.printStackTrace(System.err); 
} 

輸出是。

=>java.sql.SQLException: Unknown column 'client' in 'field list' 
=> 
=>SELECT query 
=> 
=>at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2928) at ... 
+0

感謝您的回覆! ,這裏的lineend是這個括號的最後一次出現:')'在任何新的異常堆棧跟蹤之前。 –

+0

@ParmarKamlesh我不確定,因爲我複製並粘貼了你的輸出,在這個位置上沒有換行符。但我想這應該是無論如何清楚我想用簡短的片段顯示。 – SubOptimal