2011-05-23 31 views
1

當記錄到MemoryHandler時,MemoryHandler在numofentries> size時刪除較舊的條目。避免丟棄MemoryHandler中的舊條目

我想避免這種行爲,或者至少將日誌記下來,舊的條目被抑制。

小測試案例:

import java.util.logging.*; 
public class SSCE01 { 
    public static void main (String [] args) { 

     Logger rootLogger = Logger.getLogger(""); 
     rootLogger.removeHandler(rootLogger.getHandlers()[0]); //remove default Console Handler 

     ConsoleHandler ch = new ConsoleHandler(); 
     Logger l = Logger.getLogger("test"); 
     MemoryHandler mh = new MemoryHandler(ch,3,Level.OFF); 
     l.addHandler(mh); 

     l.severe("this shouldnt be logged"); 
     l.severe("this shouldnt be logged"); 
     l.severe("this shouldnt be logged"); 
     l.severe("this should be logged"); 
     l.severe("this should be logged"); 
     l.severe("this should be logged"); 

     mh.push(); 

    } 
} 
+0

看到新版本的答案我認爲它現在更接近你所需要的。我希望它有幫助。 – 2011-05-23 10:17:46

回答

1

這是一個壞主意,你會走線填補了內存的機器。儘管如此,MemoryHandle是一個循環緩衝區,所以當它被填充時,其他條目將被刪除。如果你想讓條目不被刪除,只需將它的尺寸設置爲Integer.MAX_VALUE即可 - 這又是一個壞主意。這會與您的應用性能相沖突,並且人們往往會避免這種情況。

考慮使用將跟蹤轉儲到輔助存儲中的處理程序,添加時間戳;並使用來自那裏的痕跡建立您需要的任何邏輯。

編輯

從您所報告的代碼,你可以在它記錄MemoryHandler條目的數量另一個類封裝的日誌記錄功能。喜歡的東西:

class MyMemoryConsoleHandler { 
private Logger rootLogger; 
private MemoryHandler mh; 
private Logger l; 
private int size = 3; 
private int entries = 0; 
public MyMemoryConsoleHandler() { 
    this.rootLogger = Logger.getLogger(""); 
    this.rootLogger.removeHandler(rootLogger.getHandlers()[0]); 
    ConsoleHandler ch = new ConsoleHandler(); 
    this.l = Logger.getLogger("test"); 
    this.mh = new MemoryHandler(ch,this.size,Level.OFF); 
} 

public synchronized void push() { 
    this.mh.push(); 
    if (this.entries > this.size) { 
     this.l.severe("Entries in log discarded !!!"); 
     this.mh.push(); 
    } 
    this.entries = 0; 
} 

public synchronized void addMessage(String m) { 
    this.entries++; 
    this.l.severe(m); 
} 
} 

而不是使用Java API的日誌調用直接使用您的MyMemoryConsoleHandler讓你有在什麼被推到控制檯控制。

請注意​​方法,如果您有多線程應用程序,則需要此方法。否則,你最終可能會遇到競爭條件。

+0

Integer.MAX_VALUE不只是一個壞主意,它不可行,因爲 MemoryHandler mh = new MemoryHandler(new ConsoleHandler(),Integer.MAX_VALUE,Level.OFF);標準啓動的jvm(no -Xmx java選項)上的 會立即導致使用Integer.MAX_VALUE元素分配數組,並拋出java.lang.OutOfMemoryError:Java堆空間。內存不是用於「萬一日誌大」的情況下,每種情況下都使用內存! – AgostinoX 2011-05-23 09:50:24

+0

@AgostinoX ...好吧然後...這是一個極端糟糕的主意;) – 2011-05-23 09:54:19

+0

我認爲這錯過了觀點。我的記錄平均數可能會減少100或更少。但在此之前我不能排除超過這個數字的情況。如果MemoryHandler是用數組列表來實現的,那麼使用超大尺寸的想法就可以完美實現。由於它不是,MemoryHandler的「用例」發生了一些變化。 – AgostinoX 2011-05-23 10:07:27