Вы не можете создать 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));
}