Log4j2 RollingFileAppender 构建器方法错误 return 类型

Log4j2 RollingFileAppender builder methods wrong return type

使用 Log4j2 库版本 2.9.1。

我正在尝试以编程方式创建 RollingFileAppender

RollingFileAppender appender = RollingFileAppender.newBuilder()
                    .withName(name)
                    .withLayout(...some layout...)
                    .withStrategy(...some strategy...)
                    .build();

而且我无法编译它,因为它说该构建器中没有方法 withStrategy

如果我重新排序方法调用:

RollingFileAppender appender = RollingFileAppender.newBuilder()
                        .withStrategy(...some strategy...)
                        .withName(name)
                        .withLayout(...some layout...)
                        .build();

它无法编译,因为它说现在没有 build() 方法。 所以看起来这个构建器方法 return 一些基础构建器而不是同一个。

临时解决方法是使用通用参数创建单独的方法:

private <B extends RollingFileAppender.Builder<B>> RollingFileAppender createAppender() {
        return RollingFileAppender.<B>newBuilder()
                .withName("name")
                .withStrategy(...some strategy...)
                .withLayout(...some layout...)
                .build();
    }

然后它工作正常。但这不是通常使用Builder的方式。

所以问题是:这是一个 bug 吗?有没有更好的方法来创建 RollingFileAppender 而没有这个解决方法?

由于我无法将代码粘贴到评论中,因此将回复移至答案。

我的常春藤进口:

<dependency org="org.apache.logging.log4j" name="log4j-core" rev="2.9.1"/>

这是我的代码,它运行良好:

package org.sandbox.log4j;

import org.apache.logging.log4j.core.Layout;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.appender.RollingFileAppender;
import org.apache.logging.log4j.core.appender.rolling.RollingFileManager;
import org.apache.logging.log4j.core.appender.rolling.RolloverDescription;
import org.apache.logging.log4j.core.appender.rolling.RolloverStrategy;
import org.apache.logging.log4j.core.layout.ByteBufferDestination;

import java.util.Map;

public class RollingAppenderNew {
    public static void main(String[] args) {
        Layout<String> myLayout = new Layout<String>() {
            @Override
            public byte[] getFooter() {
                return new byte[0];
            }

            @Override
            public byte[] getHeader() {
                return new byte[0];
            }

            @Override
            public byte[] toByteArray(LogEvent event) {
                return new byte[0];
            }

            @Override
            public String toSerializable(LogEvent event) {
                return null;
            }

            @Override
            public String getContentType() {
                return null;
            }

            @Override
            public Map<String, String> getContentFormat() {
                return null;
            }

            @Override
            public void encode(LogEvent source, ByteBufferDestination destination) {

            }
        };

        RolloverStrategy myStrategy = new RolloverStrategy() {
            @Override
            public RolloverDescription rollover(RollingFileManager manager) throws SecurityException {
            return null;
            }
        };

        RollingFileAppender appender = RollingFileAppender.newBuilder()
            .withName("MyAppender")
            .withLayout(myLayout)
            .withStrategy(myStrategy)
            .build();
    }
}

我认为策略对象可能没有使用正确的基 class 并混淆了编译器。您在布局和策略中使用的基础 class 是什么?