如何解决避免丢弃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();
}
}
解决方法
这是一个坏主意,您会在存储机中填充痕迹。尽管如此,“ 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
方法,如果您有多线程应用程序,则需要此方法。否则,您可能会遇到比赛条件。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。