【发布时间】: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