Избегайте удаления старых записей в MemoryHandler - PullRequest
1 голос
/ 23 мая 2011

При входе в MemoryHandler MemoryHandler удаляет более старые записи, когда размер numofentries>.

Я хочу избежать такого поведения или, по крайней мере, отметить в журнале, что более старые записи подавлены.

Маленький тестовый пример:

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 Ответ

1 голос
/ 23 мая 2011

Это плохая идея, вы будете заполнять машину памяти следами. Несмотря на это, 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 методы, это необходимо, если у вас многопоточное приложение. В противном случае вы можете столкнуться с условиями гонки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...