2016-04-21 6 views
0

Ich versuche, das Protokoll mit regulären Ausdrücken in Java zu analysieren. Ich spiele mit einer Protokolldatei in Java, damit ich Protokollfelder extrahieren kann. Zum Beispiel habe ich die folgende Zeile:analysieren Sie eine Protokolldatei mit Java erforderlich passendes Muster

enterprises.140.625.100.50=[STUCK] ExecuteThread: '0' for queue: 'weblogic.kernel.Default<self-tuning> 

Und ich möchte die Ausgabe wie diese haben:

"enterprises" = Apr 10 21:08:55 
"Ip address" = 140.625.100.50 
"word stuck" = STUCK 

Idee ist es, das Wort „stecken“ aus der Protokolldatei zu erhalten und machen die Zählung von steckengebliebenem thread

Hier ist mein Java-Code so weit: Ich weiß nicht, wie man das Muster dafür schreibt.

import java.io.BufferedReader; 
import java.io.FileReader; 
import java.io.IOException; 
import java.text.SimpleDateFormat; 
import java.util.Calendar; 

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

import java.util.*; 

import org.apache.log4j.Logger; 
public class StuckThread { 

    static Logger logger = Logger.getLogger(StuckThread.class); 

    public static final int RETURN_CODE_SUCCESS = 0; 

    public static final int RETURN_CODE_ERROR = 1; 
    public static void main(String[] args){ 
     SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); // declare as DateFormat 
     Calendar today = Calendar.getInstance(); 

     Date d1 = today.getTime(); 
     String today1 =sdf.format(d1); 
     System.out.println(today1); 
     Calendar yesterday = Calendar.getInstance(); 
     yesterday.add(Calendar.DATE, -1); 
     Date d = yesterday.getTime(); // get a Date object 
     String yesDate = sdf.format(d); // toString for Calendars is mostly not really useful 
     System.out.println(yesDate); 

     if(yesDate.equals("2016-04-20")){ 
      BufferedReader br = null;  
      try { 
       String sCurrentLine; 
       int count = 0; 
       //String[] arLine = new String[0]; 
       br = new BufferedReader(new FileReader("C:\\testing.txt"));     

       String line = "enterprises.140.625.100.50=[STUCK] ExecuteThread: '0' for queue: 'weblogic.kernel.Default<self-tuning>; 

       String pattern = " "; 
       Pattern r = Pattern.compile(pattern); 

       Matcher m = r.matcher(line); 

       String stuckGroup=null; 

       if (m.find()) {      
       stuckGroup=m.group(5); 
       } 
       while ((sCurrentLine = br.readLine()) != null) {                 
        if (sCurrentLine.contains(stuckGroup)){         
         count++; 
        } 
       }  
       logger.info("total count of stuck thread: "+count); 
       System.exit(RETURN_CODE_SUCCESS);         
      } catch (IOException e) { 
       e.printStackTrace(); 

       System.exit(RETURN_CODE_ERROR); 

      }finally { 
       try { 
        if (br != null)br.close(); 
       } catch (IOException ex) { 
        ex.printStackTrace(); 
       } 
      } 
     }      
    } 
} 

Stecken in das Schreiben von Muster nicht sicher, wie zu schreiben. I. Kann mir bitte jemand helfen?

Antwort

0

Das folgende Muster:

String pattern = "(\\w+)\\.(.*)=\\[(.*)\\]"; 

    Pattern r = Pattern.compile(pattern); 
    Matcher m = r.matcher(line); 

    if (m.find()) { 
     System.out.println(m.group(1)); 
     System.out.println(m.group(2)); 
     System.out.println(m.group(3)); 
    } 

Returns:

enterprises 
140.625.100.50 
STUCK 

Does diese Hilfe?

+0

Benötigen Sie ein weiteres Muster für diese Linie 172.16.135.11 - - [19/Apr/2016: 09: 21: 45 -0400] "GET/ftol/pdf/RenderForm.do?formId=18483&formType=ACCT_APP_DP_PR_RSP HTTP/1.1" 200 418032 und ich brauche den Wert "418032" bitte helfen Sie auf diese – userAnalyst

+0

pattern = ". * \\ s (\\ d *)"; – Tim

+0

Oder durch Leerzeichen teilen und den letzten nehmen :) – Tim

Verwandte Themen