问题描述
|
登录到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();
}
}
解决方法
这是一个坏主意,您会在存储机中填充痕迹。尽管如此,“ 1”是一个循环缓冲区,所以当它充满时,其他条目将被删除。如果您不希望删除条目,只需将其大小设置为construct2-即可-同样,这不是一个好主意。这将与您的应用程序性能发生冲突,人们倾向于避免这种情况。
考虑使用将跟踪信息转储到辅助存储中的处理程序,并添加时间戳;并使用从那里开始的迹线构建所需的任何逻辑。
编辑
从报告的代码中,您可以将日志记录功能封装在另一个类中,该类记录“ 3”中的条目数。就像是:
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的日志记录调用,而是直接使用“ 5”键,这样您就可以控制推送到控制台的内容。
注意synchronized
方法,如果您有多线程应用程序,则需要此方法。否则,您可能会遇到比赛条件。