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 是什么?
使用 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 是什么?