当记录到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();
}
}
答案 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
方法,如果您有多线程应用程序,则需要这样做。否则你最终会遇到竞争条件。