如何在 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。
但是,我认为这对于这个用例来说还不够优化,所以我可能会使用 ConcurrentHashMap
和 computeIfAbsent( )
在包装器对象中滚动我自己的缓存,以便检索的现有 Logger 对象不会阻止其他对象。
所以我的模式是:
Logger logger = loggersPerClass.get(callerClassName);
if (logger == null) {
logger = loggersPerClass.computeIfAbsent(callerClassName, k -> LogManager.getLogger(callerClass));
}
我已经使用 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。
但是,我认为这对于这个用例来说还不够优化,所以我可能会使用 ConcurrentHashMap
和 computeIfAbsent( )
在包装器对象中滚动我自己的缓存,以便检索的现有 Logger 对象不会阻止其他对象。
所以我的模式是:
Logger logger = loggersPerClass.get(callerClassName);
if (logger == null) {
logger = loggersPerClass.computeIfAbsent(callerClassName, k -> LogManager.getLogger(callerClass));
}