避免丢弃MemoryHandler中的旧条目

时间:2011-05-23 08:45:10

标签: java logging

当记录到MemoryHandler时,当numofentries>时,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();

    }
}

1 个答案:

答案 0 :(得分: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,以便控制推送到控制台的内容。

注意synchronized方法,如果您有多线程应用程序,则需要这样做。否则你最终会遇到竞争条件。