Перезаписать java.util.logging.Logger.isLoggable (), используемый сторонней библиотекой? - PullRequest
0 голосов
/ 19 февраля 2019

Приложение, над которым я работаю, обеспечивает ведение журнала на основе текущего пользователя.Чтобы добиться этого, я использую log4j AbstractFilter, который проверяет, существует ли пользовательский уровень журнала для текущего пользователя, и возвращает соответствующий результат для таких методов, как Log.isDebugEnabled() и т. Д.

Некоторые сторонние библиотеки, используемые моимиспользование приложения java.util.logging.Я хотел бы, чтобы эти журналы были такими же, как мои собственные журналы.Но метод java.util.logging.Logger.isLoggable() возвращает результаты, отличные от моей собственной регистрации.Есть ли способ перезаписать эту функцию моей собственной логикой?

Редактировать: я использую slf4j в своем приложении с log4j2 в качестве базовой структуры ведения журнала.Я попытался использовать мост java.util.logging ~> slf4j, как описано здесь , но, похоже, он влияет только на саму функцию Log, а не на isLoggable().

1 Ответ

0 голосов
/ 20 февраля 2019

В java.util.logging вы можете изменить поведение isLoggable, применив java.util.logging.Filter и установив соответствующий уровень .

* 1007.* Из исходного кода SLF4JBridgeHandler видно, что метод публикации не вызывает isLoggable в обработчике.По этой причине вы не можете просто установить java.util.logging.Filter на SLF4JBridgeHandler.

Один из вариантов - обернуть SLF4JBridgeHandler в обработчик прокси, такой как MemoryHandler .Это можно настроить в файле logging.properties или с помощью кода:

MemoryHandler h = new MemoryHandler(new SLF4JBridgeHandler(), 1, Level.ALL);
h.setLevel(Level.ALL);
h.setFilter(new CurrentUserFilter()); //Your custom code.
java.util.logging.Logger.getLogger("").addHandler(h); //Install the bridge manually.

Другой вариант - установить фильтр log4 на всех регистраторах.Это может быть большой работой, если все регистраторы основаны на имени класса, а не на подсистемах.

...