Метод построения Log4j2 RollingFileAppender неверный тип возвращаемого значения

с использованием библиотеки 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 (). Итак, похоже, что эти методы построителя возвращают какой-то базовый построитель вместо того же самого.

Временный обходной путь заключался в создании отдельного метода с универсальным параметром:

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

Тогда нормально работает. Но это не обычный способ использования Builder.

Итак, вопрос: является ли это ошибкой и есть ли лучший способ создать RollingFileAppender без этого обходного пути?


person Ruslan Akhundov    schedule 24.11.2017    source источник
comment
Я просто попробовал сделать такой, и он отлично сработал. Я бы удостоверился, что org.apache.logging.log4j.core.Layout ‹? extends Serializable ›и org.apache.logging.log4j.core.appender.rolling.RolloverStrategy являются базовыми классами для аргументов.   -  person AlexC    schedule 24.11.2017
comment
@AlexC даже RollingFileAppender.newBuilder (). WithName (newName) .build () у меня не работает. Вы используете ту же версию библиотеки?   -  person Ruslan Akhundov    schedule 24.11.2017
comment
Да, см. Ниже, я втягиваю 2.9.1 в пустой проект. Может быть, вы случайно забираете старую версию log4j вместе с 2.9.1? Проверьте библиотеки, возможно ли это.   -  person AlexC    schedule 24.11.2017


Ответы (1)


Перенос ответов в ответ, так как я не могу вставить код в комментарий.

Мой импорт плюща:

<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();
    }
}

Я думаю, что объект стратегии может использовать неправильный базовый класс и сбивать компилятор с толку. Какие базовые классы вы используете для своего макета и стратегии?

person AlexC    schedule 24.11.2017
comment
Хорошо, теперь я вижу, что проблема в идее intellij. Он говорит, что он не компилируется, но он компилируется ... - person Ruslan Akhundov; 24.11.2017