Java:您可以从自己的类公开第三方接口吗
我们使用log4j2在整个应用程序中进行日志记录,现在我想向LogManager添加一些附加功能……同时,我希望可以在应用程序的其余部分隐藏LogManager的“实现细节”,这样就不用到处导入log4j2日志,我可以从自己专有的LogManager中公开自己的接口或类(这样,就可以重构或替换我存储日志消息的方式,而不会影响整个应用程序) 我可以像这样轻松创建自己的LogManager,称为LM:Java:您可以从自己的类公开第三方接口吗,java,logging,interface,log4j,log4j2,Java,Logging,Interface,Log4j,Log4j2,我们使用log4j2在整个应用程序中进行日志记录,现在我想向LogManager添加一些附加功能……同时,我希望可以在应用程序的其余部分隐藏LogManager的“实现细节”,这样就不用到处导入log4j2日志,我可以从自己专有的LogManager中公开自己的接口或类(这样,就可以重构或替换我存储日志消息的方式,而不会影响整个应用程序) 我可以像这样轻松创建自己的LogManager,称为LM: package com.xxx.yyy.logging; import org.apache.l
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类的每个方法?请看下面的方法:
- 在项目中创建一个同名类
,并在log4j库中复制原始org.apache.logging.log4j.LogManager
。然后编辑代码并添加所需内容org.apache.logging.log4j.LogManager
或以相同方式的其他类记录器
但您必须确保项目必须在log4j库之前加载。您可以使用生成自定义记录器包装 此工具旨在为自定义日志级别添加方便的方法或隐藏现有日志级别,但您可以将其用于任何目的 它还对客户机代码(您的应用程序)隐藏LogManager,并且生成的代码位于您指定的任何包中,因此客户机代码不会意识到它正在使用log4j2
在log4j2发生API更改后升级它时,您可能需要重新生成包装(这很少见,但2.6中会有额外的API)。您可能希望使用组合而不是继承。什么样的额外函数?你可能最好使用SLF4J,而不是滚动你自己的外观。可能是一些简单的事情,比如获得一个最近异常的列表,提供一些过滤器…没有“隐藏/包装”log4j我什么都做不了,我只是觉得这会很好,应用程序的其余部分不必知道两个日志管理器,也不必与第三方libReg紧密耦合。组合,那么我可能必须“包装”我自己的LMlogger中的所有方法,例如Logger,然后对内部对象调用相应的Logger方法(函数x(){u Logger.x();}),对于所有方法-我想知道是否有办法避免这种情况?(理想情况下,我只需要做一个typedef类型的东西,并声明com.xxx.yyy.logging.LMlogger类型与org.apache.logging.log4j.Logger完全相同……我想知道在Java中是否有办法做到这一点)