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



我创建了一个使用 log4j2 进行日志记录的包装器。这是一个自定义类,用于创建以下对象:

logger = LogManager.getLogger(caller);

问题是我在打印 LogEvent 时没有在源代码中获得正确的类名。

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

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

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

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

所以我的模式是:

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

最新更新