【问题标题】:Java: Can you expose 3rd party interface from your own classJava:你能从你自己的类中公开第 3 方接口吗
【发布时间】:2016-04-20 09:11:52
【问题描述】:

我们在整个应用程序中使用 log4j2 进行日志记录,现在我想向 LogManager 添加一些附加功能……同时,我希望可以隐藏 LogManager 的“实现细节”应用程序的其余部分,这样我就可以从我自己的专有 LogManager 公开我自己的接口或类,而不是到处导入 log4j2 Logger(这样,可以重构或替换我存储日志消息的方式而不影响整个应用程序)。

我可以像这样轻松地创建自己的 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 类的每个方法?

【问题讨论】:

  • 你可能想使用组合而不是继承。
  • 有哪些附加功能?你可能最好使用 SLF4J 而不是滚动你自己的外观。
  • 可能是简单的东西,比如获取最近的异常列表提供了一些过滤器......没有“隐藏/包装”log4j,我什么都做不了,我只是认为这会很好,剩下的应用程序不必知道两个 LogManager,也不必与第 3 方库紧密耦合
  • 注册。组合,那么我可能不得不“包装”所有方法,例如我自己的 LMlogger 中的 Logger,然后在内部对象上调用相应的 Logger 方法(函数 x() { _logger.x(); } 用于所有方法 - 我想知道是否有办法避免这种情况?
  • (理想情况下我会做一个 typedef 类型的东西,并声明类型 com.xxx.yyy.logging.LMlogger 与 org.apache.logging.log4j.Logger 相同... .想知道是否有办法在 Java 中解决这个问题)

标签: java logging interface log4j log4j2


【解决方案1】:

您可以使用tool that log4j2 provides 生成自定义 Logger 包装器。

此工具旨在为自定义日志级别添加便捷方法或隐藏现有日志级别,但您可以将其用于任何目的。

它还从客户端代码(您的应用程序)中隐藏了 LogManager,并且生成的代码位于您指定的任何包中,因此客户端代码不会知道它正在使用 log4j2。

您可能需要在升级 log4j2 后重新生成包装器,因为它有 API 更改(这种情况很少见,但 2.6 中会有额外的 API)。

【讨论】:

    【解决方案2】:

    看下面的方式:

    • 在你的项目中创建一个同名类org.apache.logging.log4j.LogManager,并将原org.apache.logging.log4j.LogManager的源代码复制到log4j lib中。然后编辑代码并添加您想要的内容。
    • Logger 或其他类同理。


    但您必须确保您的项目必须在 log4j 库之前加载。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-27
      • 1970-01-01
      相关资源
      最近更新 更多