如何在 GetLogger 中获取 class 名称并在 log4j 2 中打印正确的 class 名称

How to get class name in GetLogger and print correct class name in log4j 2

我已经使用 log4j2 创建了一个用于日志记录的包装器。这是一个创建对象的 customClass:

logger = LogManager.getLogger(caller);

问题是当我打印 LogEvent 时,我在源代码中没有得到正确的 class 名称。

例如。如果 abc.java 正在记录 log.info,我需要在源中捕获 abc.java 而不是 customClass 名称。

您不能在包装器对象中只创建一次 Logger,因为它是使用特定的 class 名称创建的(不是您想要的名称)。

所以快速而肮脏的方法是在每次日志调用时调用 LogManager.getLogger(caller).info(message),并将调用 class 作为调用者传递。 Log4J 保留已创建的记录器的哈希表,因此它不会创建新的记录器,以防同一个调用者已经存在一个记录器 class。

但是,我认为这对于这个用例来说还不够优化,所以我可能会使用 ConcurrentHashMapcomputeIfAbsent( ) 在包装器对象中滚动我自己的缓存,以便检索的现有 Logger 对象不会阻止其他对象。

所以我的模式是:

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