Установить уровень для всех регистраторов java.util.logging программно

Я работаю над приложением, которое использует slf4j и log4j2 в качестве базовой структуры ведения журнала. Приложение предоставляет настраиваемые фильтры регистрации, основанные на текущем пользователе приложения. Некоторые сторонние библиотеки используют java.util.logging (JUL) внутренне. Я хотел бы, чтобы эти журналы также отправлялись в мой пользовательский фильтр. Т.е. пока уровень лога по умолчанию может быть ERRORЯ могу настроить приложение для входа на уровень DEBUG когда конкретный пользователь использует его.

Поэтому я интегрировал мост jul-to-slf4j, чтобы регистрация JUL была перенаправлена ​​на slf4j. Я также создал собственный java.util.logging.Filter, как описано здесь, который реализует мою пользовательскую логику фильтра.

Теперь моя проблема в том, что уровень журнала по умолчанию в JUL, кажется, INFO и есть также логика, которая сначала проверяет, имеет ли сообщение для журнала менее точный уровень, чем уровень регистратора, и в этом случае сообщение отклоняется немедленно, без прохождения через фильтр (в этом случае мой пользовательский фильтр). Из-за этого я хочу, чтобы все JUL Loggers (также используемые в сторонних библиотеках) по умолчанию имели уровень ALL так что все операторы журнала JUL будут проходить через мой фильтр, где будет определено, нужно ли регистрировать сообщение или отбрасывать его.

Я попытался установить корневой регистратор JUL и его уровень обработчиков ALL как это описано в нескольких постах здесь на SO, но это, похоже, не сработало, как показано здесь. Похоже, я должен настроить JUL LogManager соответственно, и мне интересно, могу ли я сделать это программно, не вводя новый файл журнала?

0 ответов

Из кода вы можете сбросить все регистраторы, используя следующий код:

private static void resetLoggersToRoot() {
    Logger root = Logger.getLogger("");
    LogManager lm = LogManager.getLogManager();
    synchronized (lm) {
        Enumeration<String> e = lm.getLoggerNames();
        while (e.hasMoreElements()) {
            Logger l = lm.getLogger(e.nextElement());
            if (l != null && l != root) {
                l.setLevel(root.getLevel());
                l.setFilter(root.getFilter());
                l.setUseParentHandlers(root.getUseParentHandlers());
                for(Handler h : l.getHandlers()) {
                    l.removeHandler(h);
                }
            }
        }
    }
}

Однако существует проблема, когда регистраторы создаются по запросу. Поэтому вам, возможно, придется позвонитьLogManager.getLogManager().reset(); удалить любую существующую конфигурацию из logging.properties файл.

Другие вопросы по тегам