jul-to-slf4j только для определенных классов

Я работаю над JSF-проектом с Primefaces на Websphere Application Server. Поскольку Primefaces использует java.util.logging, я использую мост jul-to-slf4j для захвата журналов Primefacs в мой Log4J Logfile.

Но с использованием моста jul-to-slf4j все сообщения java.util.logging будут в моем лог-файле, включая общие сообщения Websphere, такие как "Приложение запущено" или "Сервер запущен".

Можно ли настроить jul-to-slf4j, чтобы он перенаправлял только определенные сообщения (например, все из org.primefaces) к SLF4j и оставить все как есть?

1 ответ

Я нашел решение, используя java.util.logging.Filter, фильтр просто проверяет, начинается ли имя регистратора с org.primefaces:

Для этого решения нужно программно установить SLF4JBridgeHandler и фильтр, установив его с помощью файла logging.properties, который не будет работать.

Кроме того, нужно создать сам SLF4JBridgeHandler, так как на самом деле это ошибка, SLF4JBridgeHandler не уважает фильтр из коробки.

SLF4JBridgeHandler slf4jBridgeHandler = new SLF4JBridgeHandler(){
    @Override
    public void publish(LogRecord record) {
         if (getFilter() != null && !getFilter().isLoggable(record)) {
                return;
            }
        super.publish(record);
    }
};

Filter filter = new Filter() {

    @Override
    public boolean isLoggable(LogRecord record) {
        String loggerName = record.getLoggerName();
        boolean loggable = loggerName != null && (loggerName.startsWith("org.primefaces"));
        return loggable;
    }
}; 
slf4jBridgeHandler.setFilter(filter);
java.util.logging.LogManager.getLogManager().getLogger("").addHandler(slf4jBridgeHandler);

Не звони SLF4JBridgeHandler.removeHandlersForRootLogger() так как это удалит все остальные обработчики, которые были установлены Websphere!

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