2016-03-08 24 views
1

我製作了一些系統,現在我想跟蹤它在運行時的一些統計信息。我決定使用TSV格式來記錄這些統計數據。在尋找最好的現有lib(如果可以的話,我想避免自己實現),我發現FileHandler lib幾乎就是我想要的。由於統計信息會每秒收集一次,所以我想我需要某種文件處理程序提供的大小限制的日誌文件輪換,但我仍然錯過了什麼,對我來說重要的是具有常量標題的能力在所有日誌文件中。帶恆定標題的Java旋轉日誌

所以,我想在所有日誌文件中旋轉自定義第一行(包含TSV格式的列的含義),其餘的行將是真正的統計數字。

有沒有人有任何想法如何做到這一點?我無法找到適合我或其他類似問題的lib。另外,如果你知道一些其他的lib可以實現這一點,我願意拋棄FileHandler來支持這一點。

在此先感謝!

編輯: 因此,根據@jmehrens提供的答案我做了下面的代碼,它的作品就像魅力! 這裏是一個自定義格式化類:

class CustomFormatter extends Formatter { 
    @Override 
    public String format(LogRecord record) { 
     return record.getMessage() + "\n"; 
    } 
    @Override 
    public String getHead(Handler h) { 
     return "header\n"; 
    } 
} 

這裏的工人代碼:

String path = "/tmp/temp2"; 
FileHandler fileHandler = new FileHandler(path, 300, 5); 
fileHandler.setFormatter(new CustomFormatter()); 

Logger logger = Logger.getLogger("sam.logging"); 
logger.addHandler(fileHandler); 

for(int i = 0; i < 10000; i++) 
    logger.log(new LogRecord(Level.INFO, i+" aaaaaaaaaaaaaa.")); 

這裏是示例輸出:

[/tmp] -> cat temp2.3 
header 
9957 aaaaaaaaaaaaaa. 
9958 aaaaaaaaaaaaaa. 
9959 aaaaaaaaaaaaaa. 
9960 aaaaaaaaaaaaaa. 


[/tmp] -> cat temp2.1 
header 
9985 aaaaaaaaaaaaaa. 
9986 aaaaaaaaaaaaaa. 
9987 aaaaaaaaaaaaaa. 
9988 aaaaaaaaaaaaaa. 
9989 aaaaaaaaaaaaaa. 
+0

也許個人喜好,但我不會找一個圖書館做這樣的事情。從您對需求的解釋中,似乎這種類型的應用程序很容易在合理的時間內寫入。 –

+0

也許你是對的,如果沒有優雅的答案發生我會這樣做。但是,如果可能的話,重複使用完成的代碼總是更好:) – crollywood

回答

2

你必須創建一個custom java.util.Formatterinstall it您的FileHandler。 Formatter.getHead方法用於編寫頭文件,每次FileHandler打開或旋轉時都會調用它。在這種情況下,將使用Formatter.format方法爲每個給定的LogRecord生成一行數據。因此,您需要每隔一秒生成(或重新使用)一個LogRecord,並將其複製到FileHandler。

+0

感謝您的幫助!我爲這個問題添加了最終解決方案;一個注意tho,沒有必要重用相同的LogRecord – crollywood