我创建了一个使用 log4j2 进行日志记录的包装器。这是一个自定义类,创建以下对象:logger = LogManager.getLogger(caller);问题是当我打印 LogEvent 时,我没有在源中获得正确的类名。例如。如果abc.java是logging log.info,我需要捕获abc.java源而不是customClass名称。
1 回答
手掌心
TA贡献1942条经验 获得超3个赞
您无法Logger在包装对象中创建一次,因为它是使用特定的类名(不是您想要的)创建的。
因此,快速而肮脏的方法是调用LogManager.getLogger(caller).info(message)每个日志调用,并将调用类作为调用者传递。Log4J 保留已创建的 Logger 的哈希表,因此,如果同一调用者类已存在 Logger,则不会创建新的 Logger。
但是,我认为这对于这个用例来说还不够优化,所以我可能会使用 a ConcurrentHashMapand在包装器对象中滚动我自己的缓存computeIfAbsent( ),以便现有 Logger 对象的检索不会阻止其他对象。
所以我的模式是:
Logger logger = loggersPerClass.get(callerClassName);
if (logger == null) {
logger = loggersPerClass.computeIfAbsent(callerClassName, k -> LogManager.getLogger(callerClass));
}
添加回答
举报
0/150
提交
取消