我们正在使用log4j2在整个应用程序中进行日志记录,现在我想在LogManager中添加一些额外的功能......同时,我希望可以隐藏LogManager的“实现细节”。应用程序的其余部分,以便不是在任何地方导入log4j2 Logger,而是从我自己的专有LogManager公开我自己的接口或类(这样,就可以重构或替换我存储日志消息的方式而不影响整个申请)。
我可以像这样轻松创建自己的LogManager,名为LM:
package com.xxx.yyy.logging;
import org.apache.logging.log4j.LogManager;
public class LM extends LogManager {
…add own methods here…
}
但是当我打电话时:
LM.getLogger(Application.class)
它返回一个org.apache.logging.log4j.Logger类型的对象 - 有一种通过我自己的包“封装和暴露”这个接口的简单方法,因此应用程序的其余部分不必是关注log4j?
我尝试过类似的事情:
package com.xxx.yyy.logging;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.LoggerContext;
import org.apache.logging.log4j.message.MessageFactory;
public class LMlogger extends org.apache.logging.log4j.core.Logger implements Logger {
protected LMlogger(LoggerContext context, String name,
MessageFactory messageFactory) {
super(context, name, messageFactory);
// TODO Auto-generated constructor stub
}
};
...为了实现返回的类以及预期的接口,但我仍然不能将返回的Logger对象“向下转换”到我自己的LMlogger(这是有道理的,因为我的类是子类)。但是还有另一种方法可以将log4j2实现细节保存在一个地方,而不必包装Logger类的每个方法吗?
答案 0 :(得分:2)
您可以使用tool that log4j2 provides生成自定义Logger包装器。
此工具旨在为自定义日志级别添加便捷方法或隐藏现有日志级别,但您可以将其用于任何目的。
它还会从客户端代码(您的应用程序)隐藏LogManager,并且生成的代码位于您指定的任何包中,因此客户端代码将不会意识到它正在使用log4j2。
在更改log4j2之后,您可能需要重新生成包装器(这很少见,但2.6中会有其他API)。
答案 1 :(得分:-1)
请看以下方式:
org.apache.logging.log4j.LogManager
,并在log4j lib中复制原始org.apache.logging.log4j.LogManager
的源代码。然后编辑代码并添加您想要的内容。Logger
或其他类同样的方式。
但是你必须确保你的项目必须在log4j lib之前加载。