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

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

logger = LogManager.getLogger(caller);

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

例如。如果abc.java是logging log.info,我需要捕获abc.java源而不是customClass名称。


猛跑小猪
浏览 86回答 1
1回答

手掌心

您无法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));}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java