繁体   English   中英

具有多个引用的Singleton记录器

[英]Singleton logger holding multiple references

我有一个使用log4j2的Singleton Logger,它将从各种类中调用。 输出格式为- 日期INFO com.so.pg1 abc

假设我有4个类别(pg1,pg2,pg3,pg4)。 我目前正在使用内部声明pg1,pg2,pg3的pg4类。 它们所有人中都有一个私有记录器字段。

private static SingletonLog logger = SingletonLog.getInstance(pg4.class.getName());

他们的所有方法中都包含log.info() ,我将日志记录级别设置为INFO 我需要一种方法来确保每次pg1调用log.info(“ abc”)时,输出看起来都应该像日期INFO com.so.pg1 abc pg2调用log.info(“ xyz”),其输出应类似于date INFO com.so.pg2 xyz 但是现在所有日志都具有相同的类名称com.so.pg3,如下所示。

各种记录器引用应由SingletonLog类实现处理,并且对于调用类应该是无缝的。

请帮助我纠正此问题。

示例代码在这里:

public class pg4 {
  private static SingletonLog logger = SingletonLog.getInstance(pg4.class.getName());

  pg1 two = new pg1();
  pg2 two = new pg2();
  pg3 two = new pg3();

  public void methodA() {
    logger.setLevel(INFO);
    logger.info("efg");
    pg1.methodB();  //This too has SingletonLog field with p1.class.getName() as input.
    pg2.methodC();  // same as above
    pg3.methodD();  // same as above
  }
}

public class SingletonLog {
  private static Logger internalLog = null;
  private static SingletonLog uniqueInstance = null;

  public getInstance(String className) {
    if (uniqueInstance == null)
        uniqueInstance = new unique();
    internalLog = LogManager.getLogger(className);
    return uniqueInstance;
  }
}

Expected Output for this code:
<date> INFO com.so.pg4 efg
<date> INFO com.so.pg1 abc
<date> INFO com.so.pg2 xyz
<date> INFO com.so.pg3 mno

Actual Output: 
<date> INFO com.so.pg3 efg
<date> INFO com.so.pg3 abc
<date> INFO com.so.pg3 xyz
<date> INFO com.so.pg3 mno

Singleton阻止您获取所需的输出。

首次调用Singleton.getInstance(“ abc”)时,将使用FQCN(完全限定的类名)“ abc”创建记录器。 此记录器已缓存,并且下次调用Singleton.getInstance(“ xyz”)时,它将返回与缓存相同的(abc)实例。 创建并缓存记录器后,getInstance()方法将忽略指定的FQCN。

解决方案是不使用单例。

Log4j已在内部缓存Logger。 如果调用LogManager.getLogger("abc")一些地方,并再次调用LogManager.getLogger("abc")从不同的地方,你会得到同样的 Logger实例。 但是,如果从另一个地方调用LogManager.getLogger("xyz") ,则将获得另一个 Logger实例。 这是正常用法,我相信这可以为您提供所需的确切信息。 这将导致您在“预期输出”下显示输出。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM