Установить уровень для всех регистраторов 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
файл.