2013-01-25 58 views
0

如果我不斷解析日誌文件,並檢測到它已經輪換,那麼處理此問題的最佳做法是什麼?如果日誌文件已經旋轉,該怎麼辦?

  1. 更新我的內部HashMap來反映新的文件指針( 旋轉文件的結尾)
  2. 或者我應該更新HashMap的爲0,所以它可以讀取 從一開始旋轉文件

我擔心的是,在情況沒有發生異常的情況下。如上所述,我可能從一開始就間接解析一個大文件,並在主機上施加很大的負載。 但是,如果我使用沒有。 1我可能會錯過解析日誌文件的重要事情。

這是我放在一起的代碼。

currentFilePointer = util.FileManagement.getLastFilePointerFromFile(file.getName()); 
lastFilePointer = Long.parseLong(lastReadFiles_.get(file.getName()).toString()); 

if (currentFilePointer < lastFilePointer) // file has grown 
{ 
    processLineByLine(file.getName(), currentFilePointer, lastFilePointer); 
} else if (currentFilePointer > lastFilePointer) // file has been rotated 
{ 
    lastReadFiles_.put(file.getName(), currentFilePointer); // Option 1 
} 

回答

0

從您發佈的代碼,我看不出有任何的Hashmap ......很難說哪種解決方案是更好:)

下面是我用「尾巴」文件的代碼片段,其還支持旋轉(在一個單獨的線程來運行):

@Override 
public void start() { 
    File file = ... 
    long filePointer = 0; 
    try { 
     while (running) { 
      Thread.sleep(updateInterval); 
      long len = file.length(); 
      if (len < filePointer) { 
       // File was rotated 
       filePointer = 0; 
      } else if (len > filePointer) { 
       // File must have had something added to it! 
       RandomAccessFile raf = new RandomAccessFile(file, "r"); 
       raf.seek(filePointer); 

       // Here you can read the next lines using for example a BufferedReader 

       filePointer = raf.getFilePointer(); 
       raf.close(); 
      } 
     } 
    } catch (Exception e) { 
     // ... 
    } 
} 
0

我認爲你的問題是如何在一般管理日誌文件。這些操作可以使用腳本語言(如bash)或一些通用腳本語言(如Python)來完成。有關使用java的廣泛教程是managing Logs for the Java Subsystems