我创建了一个使用 log4j2 进行日志记录的包装器。这是一个自定义类,用于创建以下对象:
logger = LogManager.getLogger(caller);
问题是我在打印 LogEvent 时没有在源代码中获得正确的类名。
例如。如果abc.java
正在记录log.info
,我需要在源代码中捕获abc.java
而不是customClass
名称。
您不能只在包装器对象中创建一次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));
}