为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

猛跑小猪 2023-09-20 17:02:11
我创建了一个使用 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));

}


查看完整回答
反对 回复 2023-09-20
  • 1 回答
  • 0 关注
  • 54 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信