有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案