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!