Skip to content

Commit 2f1065d

Browse files
committed
Use both provided and inferred Logger coordinates
1 parent 5cb5970 commit 2f1065d

File tree

2 files changed

+21
-4
lines changed

2 files changed

+21
-4
lines changed

log4j-api/src/main/java/org/apache/logging/log4j/spi/LoggerRegistry.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import java.util.concurrent.locks.Lock;
2929
import java.util.concurrent.locks.ReadWriteLock;
3030
import java.util.concurrent.locks.ReentrantReadWriteLock;
31+
import org.apache.logging.log4j.Logger;
3132
import org.apache.logging.log4j.message.MessageFactory;
3233
import org.apache.logging.log4j.message.ParameterizedMessageFactory;
3334
import org.jspecify.annotations.Nullable;
@@ -230,7 +231,10 @@ public boolean hasLogger(final String name, final Class<? extends MessageFactory
230231

231232
/**
232233
* Registers the provided logger.
233-
* <b>Logger name and message factory parameters are ignored</b>, those will be obtained from the logger instead.
234+
* <p>
235+
* The logger will be registered using the keys provided by the {@code name} and {@code messageFactory} parameters
236+
* and the values of {@link Logger#getName()} and {@link Logger#getMessageFactory()}.
237+
* </p>
234238
*
235239
* @param name a logger name
236240
* @param messageFactory a message factory
@@ -247,9 +251,16 @@ public void putIfAbsent(final String name, @Nullable final MessageFactory messag
247251
try {
248252
final MessageFactory effectiveMessageFactory =
249253
messageFactory != null ? messageFactory : ParameterizedMessageFactory.INSTANCE;
254+
// Register using the keys provided by the caller
250255
loggerByMessageFactoryByName
251256
.computeIfAbsent(name, this::createLoggerRefByMessageFactoryMap)
252257
.putIfAbsent(effectiveMessageFactory, logger);
258+
// Also register using the values extracted from `logger`
259+
if (!name.equals(logger.getName()) || !effectiveMessageFactory.equals(logger.getMessageFactory())) {
260+
loggerByMessageFactoryByName
261+
.computeIfAbsent(logger.getName(), this::createLoggerRefByMessageFactoryMap)
262+
.putIfAbsent(logger.getMessageFactory(), logger);
263+
}
253264
} finally {
254265
writeLock.unlock();
255266
}

log4j-core/src/main/java/org/apache/logging/log4j/core/util/internal/InternalLoggerRegistry.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -156,18 +156,24 @@ public Logger computeIfAbsent(
156156
// Create the logger
157157
logger = loggerSupplier.apply(name, messageFactory);
158158

159-
// Report message factory mismatches, if there is any
159+
// Report name and message factory mismatch if there are any
160+
final String loggerName = logger.getName();
160161
final MessageFactory loggerMessageFactory = logger.getMessageFactory();
161162
if (!loggerMessageFactory.equals(messageFactory)) {
162163
StatusLogger.getLogger()
163164
.error(
164-
"Newly registered logger with name `{}` and message factory `{}`, is requested to be associated with a different message factory: `{}`.\n"
165+
"Newly registered logger with name `{}` and message factory `{}`, is requested to be associated with a different name `{}` or message factory `{}`.\n"
165166
+ "Effectively the message factory of the logger will be used and the other one will be ignored.\n"
166167
+ "This generally hints a problem at the logger context implementation.\n"
167168
+ "Please report this using the Log4j project issue tracker.",
168-
name,
169+
loggerName,
169170
loggerMessageFactory,
171+
name,
170172
messageFactory);
173+
// Register logger under alternative keys
174+
loggerRefByNameByMessageFactory
175+
.computeIfAbsent(loggerMessageFactory, ignored -> new HashMap<>())
176+
.putIfAbsent(loggerName, new WeakReference<>(logger));
171177
}
172178

173179
// Insert the logger

0 commit comments

Comments
 (0)