где находится logger.getAppender (переход с log4j на slf4j + log4j) - PullRequest
0 голосов
/ 03 мая 2018

Существующий код настраивает регистратор программно. Вот как это делает

public void init (String logFile, Logger logger){
    Validate.isTrue(logger.getAppender(APPENDER_NAME) == null, "Logger has configured project appender");

    //remaining code
}

Теперь я изменил logger объект с log4j logger на org.slf4j.Logger и получил ошибку, что getAppender метод не существует. Что должно быть альтернативой здесь.

1 Ответ

0 голосов
/ 05 мая 2018

Боюсь, что это невозможно при использовании slf4j API.

slf4j - это API фасада регистратора, который предоставляет только высокоуровневые методы, такие как debug, trace и т. Д. В нем нет понятия appenders, которое является деталью реализации ведения журнала с нижележащим бетоном, например log4j.

Выдержка из FAQ по SLF4J :

SLF4J - это только фасад, а это означает, что он не обеспечивает полное решение для ведения журнала. Такие операции, как настройка дополнений или настройка уровней ведения журнала, не могут быть выполнены с SLF4J. Таким образом, в какой-то момент времени любое нетривиальное приложение должно будет напрямую вызывать базовую систему ведения журнала. Другими словами, полная независимость от API, лежащего в основе системы ведения журналов, невозможна для автономного приложения. Тем не менее, SLF4J снижает влияние этой зависимости до почти безболезненных уровней.

То же самое относится и к log4j2 API.

Какие есть варианты:

  1. Отдельная часть кода, которая будет связана с регистратором log4j и выполнит там необходимые настройки и проверки.

  2. Другой подход заключается в приведении slf4j logger к log4j после проверки:

    // log4j 1.x
    if (logger instanceof org.apache.logging.log4j.core.Logger) {
       org.apache.log4j.Logger log4j = (org.apache.log4j.Logger) logger;
       // access to log4j.getAppender("APPENDER_NAME");
    }
    
...