Это плохая идея, вы будете заполнять машину памяти следами. Несмотря на это, 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);
}
}
Вместо использования вызовов журнала API Java напрямую используйте MyMemoryConsoleHandler
, чтобы иметь возможность контролировать то, что отправляется на консоль.
Обратите внимание на synchronized
методы, это необходимо, если у вас многопоточное приложение. В противном случае вы можете столкнуться с условиями гонки.