Log4j2 с неверным именем класса slf4j - PullRequest
0 голосов
/ 07 августа 2020

Я использую Log4j2 с slf4j. У меня есть собственный класс Wrapper над slf4j, в котором определен FCQN, чтобы он печатал имя класса фактического класса, откуда вызывается регистратор.

Я пытаюсь запустить тестовый пример в IDE, но консоль IDE всегда печатать имя класса-оболочки (LogWrapper).

18:47:12.987 [main] INFO  com.abc.services.logging.LogWrapper - "Dummy message"

Я хочу, чтобы имя фактического класса (Myclass) было напечатано в консоли IDE

18:47:12.987 [main] INFO  com.abc.services.foo.Myclass - "Dummy message"

Регистратор slf4j создается внутри класса-оболочки и инициализируется следующим образом

String FQCN = LogWrapper.class.getName();
LocationAwareLogger LOG = (LocationAwareLogger)LoggerFactory.getLogger(LogWrapper.class);

Есть ли способ решить эту проблему, изменив файл конфигурации log4j2?

1 Ответ

0 голосов
/ 07 августа 2020

Нет. Чтобы получить имя класса вызывающего API журналирования, Log4j должен пройти трассировку стека (дорогостоящая операция) и найти метод, который был вызван, а затем найти следующий элемент трассировки стека. Это достигается путем включения полного имени класса, реализующего вызванный метод. Когда вы написали свою оболочку SLF4J, у вас нет возможности передать имя этого класса в Log4j, поэтому Log4j будет думать, что ваша оболочка является вызывающей стороной, что верно, поскольку она вызывает SLF4J.

Чтобы иметь собственный класс ведения журнала, вам необходимо создать оболочку Logger для API Log4j, чтобы вы могли передать FQCN в качестве параметра. В качестве примера вы можете посмотреть файлы Log4j Log4jLogger и Log4jLoggerFactory для SLF4J.

...