2016-11-20 101 views
1

我有一個MySQL日誌文件,其中包含每個文件上的各種信息(當進行連接時,進行查詢時,連接何時結束等),我必須解析日誌文件,這樣我就可以將每行的數據放在一個數組中,然後根據它進行一些計算。解析Java中的MySQL日誌文件

這裏是從日誌文件的示例:

151011 12:52:51  1 Connect  [email protected] on testdb 
       1 Query  SHOW SESSION VARIABLES 
       1 Query  SHOW COLLATION 
       1 Query  SET character_set_results = NULL 
       1 Query  SET autocommit=1 
       1 Query  SELECT q1,q2 FROM q_table 
       1 Query  SELECT s1,s2 FROM s_table 
       1 Query  select count(*) as c from i_table WHERE val = 1 
       1 Query  select count(*) as c from k_table WHERE cid = 1 
       1 Query  SELECT name,age FROM i_table WHERE ck = 1 
151011 12:52:54  1 Query  SELECT name,aid FROM j_table WHERE co = 1 
151011 12:52:59  1 Query  SELECT * from values where lastname='smith' 

不幸的是該行中的空間不被製表符(「\ t」的)分離。更糟糕的是,一些行在開始時有額外的日期和時間,而有些則沒有。這意味着某些行比其他行有更多的數據需要解析。我將如何解析這個日誌文件?

到目前爲止,我有以下幾點:

Scanner scan = new Scanner(new File("data.log")); 
ln = scan.nextLine(); 
ar = ln.split("\t"); 
System.out.println(ar[0]); 
System.out.println(ar[1]); 

但是,打印以下行,例如:

151018 12:52:51        // First slot in the array 
     1 Connect  [email protected] on tested // Second slot in the array 

有沒有辦法做到這一點?或者只是不可能?

+0

「不幸的是,行中的空格不會被製表符分隔(」\ t「)」這是什麼意思? – sehe

+0

只需使用'\ s'匹配所有空格字符。 –

+0

如果行中的每個元素在它們之間都有一個共同的分隔符,那將會容易得多。例如,日期,然後標籤空間,然後動作,然後選項卡空間...等等。但是,這裏全是空間。 – DemCodeLines

回答

2

在我看來,你想要做一個正則表達式用空格分隔以下組:

  1. 日期特定的正則表達式(本組是可選的)
  2. 一些
  3. 無論是「連接」, 「查詢」,或任何字符串,這將是在同一個地方
  4. 與非空白開始,以繼續任何一組

    String dateTime, number, type, message; 
    Pattern pattern = Pattern.compile(
        "(\\d{6} \\d{2}:\\d{2}:\\d{2})?\\s+(\\d+)\\s+(Connect|Query)\\s+([^\\s].*)"); 
    Matcher matcher = pattern.matcher(ln); 
    
    if (matcher.matches()) { 
        dateTime = matcher.group(1);//this will be null if no date 
        number = matcher.group(2); 
        type = matcher.group(3); 
        message = matcher.group(4); 
    } 
    
+0

謝謝。這個問題被分解,這有助於顯着。我會盡力的。 – DemCodeLines

+0

偉大的感覺自由投票和或選擇答案。 :) @DemCodeLines – Danny

+1

請注意,此日誌是出了名設計不當解析。例如,如果查詢中有換行符,則單個查詢實際上將跨越多行。一個更好的主意是使用「慢查詢日誌」設置的最短時間爲0(使所有查詢都被認爲「慢」,因此所有的查詢將被記錄)。它的格式更加機器可讀的,它給你更好的信息,如檢查VS行的行返回。 –