Java:你能从你自己的类中公开第三方接口吗?

时间:2016-04-20 09:11:52

标签: java logging interface log4j log4j2

我们正在使用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类的每个方法吗?

2 个答案:

答案 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之前加载。