Необходимо записывать журналы уровня WARNING в другой файл, используя обработчик файлов, но обработчик консоли по-прежнему отображает INFO и SEVERE, но не предупреждает, когда .level = INFO - PullRequest
0 голосов
/ 22 января 2019

У нас есть приложение Java на Websphere, где нам нужно, чтобы SystemOut.log печатал только уровень журнала SEVERE и INFO (используя существующий java.util.logging по умолчанию ConsoleHandler), но нам нужно ПРЕДУПРЕЖДЕНИЕ, записанное в отдельный файл с использованием FileHandler.

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

Но уровни предупреждения также записываются в SystemOut.log, нужен способостановить их появление

logger.addHandler(new LevelBasedFileHandler("../logs/warning.log", Level.WARNING));


<i>logger.setFilter(new LevelBasedFilter());</i> - Trying to see if i can filter

<b>logger.setUseParentHandlers(false);</b>

с помощью logger.setUseParentHandlers (false) не печатает какую-либо информацию в SystemOut.log, если я удаляю ее, я также вижу информацию ПРЕДУПРЕЖДЕНИЕ.Любая идея, я могу отфильтровать уровень предупреждения от этого?

1 Ответ

0 голосов
/ 23 января 2019

Если вы фильтруете на уровне регистратора, который будет подавлять записи журнала, прежде чем они достигнут какого-либо из обработчиков.Что вы должны сделать, это установить фильтры на существующие обработчики.

Например, создайте фильтр, который принимает логическое значение:

import java.util.logging.Filter;
import java.util.logging.Level;
import java.util.logging.LogRecord;

public class WarningFilter implements Filter {

   private final boolean complement;

    public WarningFilter(final boolean complement) {
        this.complement = complement;
    }

    @Override
    public boolean isLoggable(LogRecord r) {
        return Level.WARNING.equals(r.getLevel()) != complement;
    }
}

Далее вы должны установить свой фильтр на каждый обработчик.Например:

    private static final Logger logger = Logger.getLogger("some.other.logger.name");
    public static void main(String[] args) throws Exception {
        boolean found = false;
        for (Handler h : Logger.getLogger("").getHandlers()) {
            h.setFilter(new WarningFilter(h instanceof ConsoleHandler));
        }

        if(!found) {
            Handler h = new ConsoleHandler();
            h.setFilter(new WarningFilter(true));
        }

        Handler h = new FileHandler();
        h.setFilter(new WarningFilter(false));
        logger.addHandler(h);

    }
...