You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by pk...@apache.org on 2023/01/26 04:46:26 UTC

[logging-log4j2] 02/03: Make `AbstractBuilder.logBuilder` static

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 <pi...@karwasz.org>
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);
-        }
-    }
 }