java Log4j2:在StringBuilderPerformAttable上调用toString()而不是formatTo()
我使用的是log4j2版本2.10.0
我已经实现了StringBuilderFormattable
接口来实现无gc日志记录
实施示例:
public static class Formattable implements StringBuilderFormattable {
@Override
public void formatTo(StringBuilder buffer) {
buffer.append("FORMAT_TO_CALLED");
}
@Override
public String toString() {
return "TO_STRING_CALLED";
}
}
我打电话给LOGGER.info(new Formattable());
以及获取TO_STRING_CALLED
而不是预期的FORMAT_TO_CALLED
我目前正在使用以下属性运行它:
-Dlog4j2.enable.threadlocals=true
-Dlog4j2.enable.direct.encoders=true
-Dlog4j2.asyncLoggerWaitStrategy=Yield
经过一番挖掘,我发现log4j findjavax.servlet.Servlet
类并将Constants.IS_WEB_APP
属性设置为true
,因此我的-Dlog4j2.enable.threadlocals=true
实际上设置为false,因为它使用了ParameterizedMessageFactory
而不是ReusableMessageFactory
,这会导致调用toString
,所以我尝试在具有相同配置但没有javax.servlet.Servlet
的简单项目中运行它,效果很好
所以问题是为什么它有这样的行为,它调用toString()
而不是formatTo()
?为什么它依赖于web应用程序?我理解webapp threadlocals可能导致的问题,但我不理解为什么ParameterizedMessageFactory
不使用这个formatTo
。另外,如果我仅从核心线程使用此StringBuilderFormattable
进行日志记录,那么将log4j2.is.webapp
设置为false
安全吗
共 (0) 个答案