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