Как получить имя класса в GetLogger и вывести правильное имя класса в log4j 2 - PullRequest
0 голосов
/ 03 октября 2019

Я создал оболочку для входа в систему с помощью log4j2. Это customClass, создающий объект:

logger = LogManager.getLogger(caller);

Проблема в том, что я не получаю правильное имя класса в источнике, когда я печатаю LogEvent.

Например. Если abc.java регистрирует log.info, мне нужно захватить abc.java в источнике вместо customClass имени.

1 Ответ

0 голосов
/ 03 октября 2019

Вы не можете создать Logger только один раз в вашем объекте-обертке, потому что он создается с определенным именем класса (не тем, которое вы хотите).

Таким образом, быстрый и грязный способ состоит в том, чтобывызывайте LogManager.getLogger(caller).info(message) при каждом вызове журнала и передавайте вызывающий класс в качестве вызывающего. Log4J хранит хеш-таблицу уже созданных регистраторов, поэтому он не будет создавать новый регистратор, если он уже существует для того же класса вызывающего абонента.

Однако я не думаю, что это достаточно оптимизировано для этого варианта использования, поэтомуЯ, вероятно, свернул бы свое собственное кэширование в объекте-обертке, используя ConcurrentHashMap и computeIfAbsent( ), чтобы извлечение существующих объектов Logger не блокировало другие.

Таким образом, мой шаблон будет:

Logger logger = loggersPerClass.get(callerClassName);
if (logger == null) {
    logger = loggersPerClass.computeIfAbsent(callerClassName, k -> LogManager.getLogger(callerClass));
}
...