0

我在理解 log4j2 包装器的使用方面确实有些困难。

如果您点击此链接,您会发现附加了一个使用 AbstractLoggerWrapper 的示例。我刚刚复制了以下代码。

public class Log4j2Logger extends AbstractLogger 
{

    private static final String FQCN = AbstractLogger.class.getName();
    private AbstractLoggerWrapper logImpl;

    public Log4j2Logger(String name, String prefix, String logId, String instanceId)
    {
        super(name, prefix, logId, instanceId);
        final AbstractLogger logger = (AbstractLogger) LogManager.getLogger(name);
        this.logImpl = new AbstractLoggerWrapper(logger, name);
    }

    ....

    @Override
    public void log(String message, LogLevel level)
    {
        logImpl.log(null, FQCN, toImplLevel(level), new SimpleMessage(createMessage(message)), null);
    }

    ....
}

我不明白使用 AbstractLoggerWrapper 对 AbstractLogger 和实习生进行子类化的原因。我实际上可以从 Log4j2Logger 中删除扩展并封装 AbstractLoggerWrapper。您是否看到像上面截断的代码那样这样做的任何原因?

有没有办法对 AbstractLogger 进行子类化(如preferred)并在没有包装器的情况下使用它?并像策略模式一样创建它?例如,

LogManager.getLogger( class.getName(), Log4j2Logger.class ) 

也许这就是他们试图在扩展部分中解释的内容,但我还不明白。有人知道怎么做吗?

真诚的基督徒

更新:我错过了说,我使用包装器的原因是因为现有的带有包装器的 log4j (1.2) 项目。

4

1 回答 1

0

如果您查看AbstractLoggerWrapper的文档:

包装类,它公开受保护的 AbstractLogger 方法以支持包装的记录器。

您将清楚地看到为什么它以 Apache 的方式完成。如果您决定忽略接口的合同并按照自己的方式行事,那么您实际上是在说

“我不在乎图书馆是怎么做的,我知道得更好”

因此,您承担了很大的风险,而不是使用已提供的通用解决方案。我真诚地怀疑您是否拥有如此深奥的环境,以至于图书馆可能不够用。

回顾一下,请遵循图书馆文档中规定的合同。

于 2013-06-17T12:08:38.323 回答