2014-01-10 61 views
0

我有一個從另一個腳本每分鐘調用一次的jar。在這個jar中,我創建了一個JavaLogger來記錄Jar運行時發生的情況。 JavaLogger寫入的日誌文件稱爲myLog.0。我有下面的代碼允許它去.1/.2/.3/.4。JavaLogger隨機寫入第二個文件

try { 
    FileHandler fileHandler = new FileHandler(filePath, 5242880, 5, true); 
    fileHandler.setFormatter(new java.util.logging.Formatter() { 
    @Override 
    public String format(LogRecord logRecord) { 
     return "[" + logRecord.getLevel() + " " + createDateTimeLog() + "] " + logRecord.getMessage() + "\r\n"; 
    } 
    }); 
    logger.addHandler(fileHandler); 
} catch (IOException e) {} 

所以我期望日誌會增長。但是,每隔一段時間日誌都會打印到myLog.0.1。我猜這是因爲文件被鎖定。然而,這從來沒有發生在我的罐子中期。它在jar運行的整個過程中記錄到.0.1。該文件仍然可以鎖定我以前的運行?

如果是這樣,我甚至試圖在Jar退出之前關閉處理程序。只有一個從罐出口點,我把下面的代碼之前正確的:

MyLogger.logger.getHandlers()[0].close(); 

我已經通過調試運行這個並沒有永遠只一個處理程序(我加的FileHandler)。

正如我所說的,這只是隨機發生的。罐子的前3次運行可以是.0,然後是第四次運行到.0.1。然後下一個10可能再次正確。這很難說。然而它確實發生得相當頻繁(我會說它大約每1/8次寫入.0.1)。

任何想法/建議將是偉大的。提前致謝。

回答

0

該文件仍然可以鎖定從我以前的運行?

可能是兩個JVM同時運行您的jar。添加代碼以獲取RuntimeMXBean,然後添加單個日誌語句以記錄runtime namestart time。運行時名稱通常映射到進程ID和主機名。

FileHandler盡其所能阻止兩個併發運行的JVM寫入相同的日誌文件。如果允許這種行爲,日誌文件幾乎不可能閱讀和理解。

如果你真正想寫的一切,一個日誌文件,那麼你必須執行下列操作之一:

  1. 阻止併發的JVM進程通過更改如何啓動它開始。
  2. 如果另一個JVM正在運行您的代碼並在創建FileHandler之前退出,請檢查您的代碼。
  3. 讓每個JVM寫入一個獨特的日誌文件並創建代碼以安全地將這些文件合併爲一個文件。
  4. 創建一個代理處理程序,爲每個日誌記錄創建並關閉一個FileHandler。代理處理程序將使用預定義的文件名(與日誌文件不同)和FileLock來從不同的JVM序列化對日誌文件的訪問。
  5. 使用專用進程寫入日誌文件並讓所有JVM向該進程發送日誌消息。
+0

對不起,遲到的迴應。我不得不繼續這個項目,直到現在沒有時間重新討論這個問題。無論如何,你對此似乎是正確的。 我有一次運行的jar的多個實例。然後,當他們嘗試訪問日誌時,它將被鎖定並寫入.0,.1等。 我考慮過使用文件鎖(java.nio.channels)。不過,我似乎無法讓它與日誌文件一起工作。關於我應該從哪裏出發的任何想法? –

+0

我更新了答案。如果你需要併發的JVM,那麼代理處理程序就是要走的路。如果您需要,我可以包含一些示例代碼。 – jmehrens