2010-12-20 88 views
2

全部,解析Java中的日誌文件

我有一個包含以下內容的日誌文件。

Request from Centercord. 
2010-12-14 12:42:13.724 [ 6796] **************************** 
2010-12-14 12:42:13.724 [ 6796] 1111111111111111 
2010-12-14 12:42:13.724 [ 6796]22222222222 

Response from Centercord. 
2010-12-14 12:42:21.802 [ 5960] 11111111111111 
2010-12-14 12:42:21.802 [ 5960] ffffffffffffffffffffffffffff 
2010-12-14 12:42:21.802 [ 5960] tttttttttttttttttttttttttttt 

Request from Centercord. 
2010-12-14 12:42:13.724 [ 6796] **************************** 

我需要創建兩個日誌文件,一個是用於存儲所有的請求的細節,另一種是用於存儲所有響應的詳情。我如何解析這個並準備兩個日誌文件?

我需要下面的答案。

Log 1: 

Request from Centercord. 
2010-12-14 12:42:13.724 [ 6796] **************************** 
2010-12-14 12:42:13.724 [ 6796] 1111111111111111 
2010-12-14 12:42:13.724 [ 6796]22222222222 

2010-12-14 12:42:13.724 [ 6796] **************************** 

Log 2: 

Response from Centercord. 
2010-12-14 12:42:21.802 [ 5960] 11111111111111 
2010-12-14 12:42:21.802 [ 5960] ffffffffffffffffffffffffffff 
2010-12-14 12:42:21.802 [ 5960] tttttttttttttttttttttttttttt 

問候, Kanagaraj

回答

0

您可以使用正則表達式或RandomAccessFiles得到你想要的方式的數據。

+0

能否請您給我一些示例代碼? – user454894 2010-12-20 11:54:12

0
StringBuilder requestBuilder = new StringBuilder("Request from Centercord.\n"); 
StringBuilder responseBuilder = new StringBuilder("Response from Centercord.\n"); 

boolean isResponse = false; 
for (String line:getLinesFromLogFile()) { 
    if (line.startsWith("Response")) { 
     if(isResponse) 
     responseBuilder.append("\n"); 
     isResponse = true; 
    } else if (line.startsWith("Request")) { 
     if(!isResponse) 
     requestBuilder.append("\n"); 
     isResponse = false; 
    } else { 
     if (isResponse) { 
     responseBuilder.append(line).append("\n"); 
     } else { 
     requestBuilder.append(line).append("\n"); 
     } 
    } 
} 

現在將兩個StringBuilders的內容轉儲到目標文件。

8

這裏是我會怎麼做:

import java.io.*; 
import java.util.Scanner; 

public class Test { 

    public static void main(String[] args) { 

     try { 

      PrintWriter requests = new PrintWriter("requests.txt"); 
      PrintWriter responses = new PrintWriter("responses.txt"); 
      PrintWriter currentLog = null; 

      Scanner s = new Scanner(new File("log.txt")); 
      while (s.hasNextLine()) { 
       String line = s.nextLine(); 
       if (line.startsWith("Request from")) 
        currentLog = requests; 
       else if (line.startsWith("Response from")) 
        currentLog = responses; 
       else if (currentLog != null) 
        currentLog.println(line); 
      } 

      requests.close(); 
      responses.close(); 
      s.close(); 
     } catch (IOException ioex) { 
      // handle exception... 
     } 
    } 
} 

鑑於log.txt的

Request from Centercord. 
2010-12-14 12:42:13.724 [ 6796] **************************** 
2010-12-14 12:42:13.724 [ 6796] 1111111111111111 
2010-12-14 12:42:13.724 [ 6796]22222222222 

Response from Centercord. 
2010-12-14 12:42:21.802 [ 5960] 11111111111111 
2010-12-14 12:42:21.802 [ 5960] ffffffffffffffffffffffffffff 
2010-12-14 12:42:21.802 [ 5960] tttttttttttttttttttttttttttt 

Request from Centercord. 
2010-12-14 12:42:13.724 [ 6796] **************************** 

它產生,requests.txt

2010-12-14 12:42:13.724 [ 6796] **************************** 
2010-12-14 12:42:13.724 [ 6796] 1111111111111111 
2010-12-14 12:42:13.724 [ 6796]22222222222 

2010-12-14 12:42:13.724 [ 6796] **************************** 

...和responses.txt

2010-12-14 12:42:21.802 [ 5960] 11111111111111 
2010-12-14 12:42:21.802 [ 5960] ffffffffffffffffffffffffffff 
2010-12-14 12:42:21.802 [ 5960] tttttttttttttttttttttttttttt 
0

爲了減少樣板代碼,下載Google Guava並使用此代碼:

File inputFile = new File("input.log"); 
File outputLog1 = new File("log1.log"); 
File outputLog2 = new File("log2.log"); 

String match1 = "[ 6796]"; 
String match2 = "[ 5960]"; 

Files.append("Request from Centercord.\n", outputLog1, Charsets.UTF_8); 
Files.append("Response from Centercord.\n", outputLog2, Charsets.UTF_8); 

List<String> lines = Files.readLines(inputFile, Charsets.UTF_8); 

for (String line : lines) { 
    if(line.contains(match1)) Files.append(line + "\n", outputLog1, Charsets.UTF_8); 
    if(line.contains(match2)) Files.append(line + "\n", outputLog2, Charsets.UTF_8); 
} 
+3

不要那樣做!所有線路都進入記憶。這對於大多數日誌文件來說太多了!你的靜態類設計模式也是不好的做法 – Karussell 2011-03-30 09:05:30