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

Reply via email to