This is an automated email from the ASF dual-hosted git repository. pkarwasz pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git
commit 635ca9b67ab4df0b3a017c1fff5f5e7a08c2e2d8 Author: Piotr P. Karwasz <[email protected]> AuthorDate: Sat Jan 14 21:16:46 2023 +0100 Make `AbstractBuilder.logBuilder` static A non-static `ThreadLocal` for hundreds of loggers creates thousands of `LogBuilder` instances. --- .../logging/log4j/internal/DefaultLogBuilder.java | 15 ++++++------ .../apache/logging/log4j/spi/AbstractLogger.java | 27 ++++------------------ 2 files changed, 11 insertions(+), 31 deletions(-) diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/internal/DefaultLogBuilder.java b/log4j-api/src/main/java/org/apache/logging/log4j/internal/DefaultLogBuilder.java index cd472c43e3..6a7a2f31cc 100644 --- a/log4j-api/src/main/java/org/apache/logging/log4j/internal/DefaultLogBuilder.java +++ b/log4j-api/src/main/java/org/apache/logging/log4j/internal/DefaultLogBuilder.java @@ -39,7 +39,7 @@ public class DefaultLogBuilder implements BridgeAware, LogBuilder { private static final Logger LOGGER = StatusLogger.getLogger(); private static final Message EMPTY_MESSAGE = new SimpleMessage(Strings.EMPTY); - private final Logger logger; + private Logger logger; private Level level; private Marker marker; private Throwable throwable; @@ -52,13 +52,11 @@ public class DefaultLogBuilder implements BridgeAware, LogBuilder { this.logger = logger; this.level = level; this.threadId = Thread.currentThread().getId(); - this.inUse = true; + this.inUse = level != null; } - public DefaultLogBuilder(final Logger logger) { - this.logger = logger; - this.inUse = false; - this.threadId = Thread.currentThread().getId(); + public DefaultLogBuilder() { + this(null, null); } @Override @@ -71,12 +69,13 @@ public class DefaultLogBuilder implements BridgeAware, LogBuilder { * @param level The logging level for this event. * @return This LogBuilder instance. */ - public LogBuilder reset(final Level level) { - this.inUse = true; + public LogBuilder reset(Logger logger, Level level) { + this.logger = logger; this.level = level; this.marker = null; this.throwable = null; this.location = null; + this.inUse = true; return this; } diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/spi/AbstractLogger.java b/log4j-api/src/main/java/org/apache/logging/log4j/spi/AbstractLogger.java index 2f6ddd2262..dc76835569 100644 --- a/log4j-api/src/main/java/org/apache/logging/log4j/spi/AbstractLogger.java +++ b/log4j-api/src/main/java/org/apache/logging/log4j/spi/AbstractLogger.java @@ -84,7 +84,7 @@ public abstract class AbstractLogger implements ExtendedLogger { private final MessageFactory messageFactory; private final FlowMessageFactory flowMessageFactory; private static final ThreadLocal<int[]> recursionDepthHolder = new ThreadLocal<>(); // LOG4J2-1518, LOG4J2-2031 - private final transient ThreadLocal<DefaultLogBuilder> logBuilder; + private static final ThreadLocal<DefaultLogBuilder> logBuilder = ThreadLocal.withInitial(DefaultLogBuilder::new); /** @@ -95,7 +95,6 @@ public abstract class AbstractLogger implements ExtendedLogger { this.name = canonicalName != null ? canonicalName : getClass().getName(); this.messageFactory = LoggingSystem.getMessageFactory(); this.flowMessageFactory = LoggingSystem.getFlowMessageFactory(); - this.logBuilder = new LocalLogBuilder(this); } /** @@ -117,7 +116,6 @@ public abstract class AbstractLogger implements ExtendedLogger { this.name = name; this.messageFactory = messageFactory == null ? LoggingSystem.getMessageFactory() : messageFactory; this.flowMessageFactory = LoggingSystem.getFlowMessageFactory(); - this.logBuilder = new LocalLogBuilder(this); } /** @@ -2742,11 +2740,7 @@ public abstract class AbstractLogger implements ExtendedLogger { */ @Override public LogBuilder always() { - final DefaultLogBuilder builder = logBuilder.get(); - if (builder.isInUse()) { - return new DefaultLogBuilder(this); - } - return builder.reset(Level.OFF); + return getLogBuilder(Level.OFF); } /** @@ -2757,26 +2751,13 @@ public abstract class AbstractLogger implements ExtendedLogger { @Override public LogBuilder atLevel(final Level level) { if (isEnabled(level)) { - return (getLogBuilder(level).reset(level)); - } else { - return LogBuilder.NOOP; + return getLogBuilder(level).reset(this, level); } + return LogBuilder.NOOP; } private DefaultLogBuilder getLogBuilder(final Level level) { final DefaultLogBuilder builder = logBuilder.get(); return Constants.isThreadLocalsEnabled() && !builder.isInUse() ? builder : new DefaultLogBuilder(this, level); } - - private static class LocalLogBuilder extends ThreadLocal<DefaultLogBuilder> { - private final AbstractLogger logger; - LocalLogBuilder(final AbstractLogger logger) { - this.logger = logger; - } - - @Override - protected DefaultLogBuilder initialValue() { - return new DefaultLogBuilder(logger); - } - } }
