Использование обработчика журналов - PullRequest
0 голосов
/ 12 марта 2020

мой вопрос похож на Почему java .util.logging.Logger печатает в stderr? сообщение. Я хочу использовать только один обработчик в моем журнале, где он должен печатать операторы INFO в выходной поток и WARNING & SEVERE в поток ошибок. Это возможно ? Если я возьму, например, два обработчика, один для выходного потока - и уровень в качестве INFO, другой для потока ошибок - и уровень в этом случае как WARNING / SEVERE, в этом случае приложение дважды показывает сообщения: одно - без потока, а другое - с потоком ошибок. Так какое-нибудь решение?

1 Ответ

0 голосов
/ 12 марта 2020

Это возможно с одним или двумя обработчиками . Недостающим является то, что вам нужно создать фильтр для обработчика OUT, который ограничивает наивысший уровень. Также вам необходимо убедиться, что к регистратору root не подключены другие ConsoleHandlers, которые могут загрязнить ваш тест. Вы можете распечатать дерево логгера , чтобы увидеть, какие обработчики подключены.

Вот подтверждение концепции:

import java.io.PrintStream;
import java.util.logging.ConsoleHandler;
import java.util.logging.Filter;
import java.util.logging.Handler;
import java.util.logging.Level;
import java.util.logging.LogManager;
import java.util.logging.LogRecord;
import java.util.logging.Logger;

public class OutErrorTest {

    private static final Logger log = Logger.getLogger("");

    public static void main(String[] args) {
        LogManager.getLogManager().reset(); //A quick way to remove all handlers.

        Handler out = newSystemOut();
        Handler err = newSystemErr();

        final Level fence = Level.WARNING;

        out.setLevel(Level.ALL);
        out.setFilter(new LessThanLevelFilter(fence));
        err.setLevel(fence);

        log.addHandler(out);
        log.addHandler(err);
        log.setLevel(Level.ALL);

        log.finest("Finest Log");
        log.finer("Finer Log");
        log.fine("Fine Log");
        log.config("Config Log");
        log.info("Info Log");
        log.warning("Warning Log");
        log.severe("Severe Log");

    }

    private static Handler newSystemErr() {
        return new ConsoleHandler();
    }

    private static Handler newSystemOut() {
        Handler h = null;
        final PrintStream err = System.err;
        System.setErr(System.out);
        try {
            h = new ConsoleHandler(); // Snapshot of System.err
        } finally {
            System.setErr(err);
        }
        return h;
    }

    public static class LessThanLevelFilter implements Filter {

        private final int lvl;

        public LessThanLevelFilter(final Level max) {
            this(max.intValue());
        }

        public LessThanLevelFilter(final int max) {
            this.lvl = max;
        }

        @Override
        public boolean isLoggable(LogRecord r) {
            return r.getLevel().intValue() < lvl;
        }
    }
}
...