Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:您可以从自己的类公开第三方接口吗_Java_Logging_Interface_Log4j_Log4j2 - Fatal编程技术网

Java:您可以从自己的类公开第三方接口吗

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

我们使用log4j2在整个应用程序中进行日志记录,现在我想向LogManager添加一些附加功能……同时,我希望可以在应用程序的其余部分隐藏LogManager的“实现细节”,这样就不用到处导入log4j2日志,我可以从自己专有的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类的每个方法?

请看下面的方法:

  • 在项目中创建一个同名类
    org.apache.logging.log4j.LogManager
    ,并在log4j库中复制原始
    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中是否有办法做到这一点)