[英]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.