2828import java .util .concurrent .locks .Lock ;
2929import java .util .concurrent .locks .ReadWriteLock ;
3030import java .util .concurrent .locks .ReentrantReadWriteLock ;
31+ import org .apache .logging .log4j .Logger ;
3132import org .apache .logging .log4j .message .MessageFactory ;
3233import org .apache .logging .log4j .message .ParameterizedMessageFactory ;
3334import org .jspecify .annotations .NullMarked ;
@@ -246,7 +247,10 @@ public boolean hasLogger(final String name, final Class<? extends MessageFactory
246247
247248 /**
248249 * Registers the provided logger.
249- * <b>Logger name and message factory parameters are ignored</b>, those will be obtained from the logger instead.
250+ * <p>
251+ * The logger will be registered using the keys provided by the {@code name} and {@code messageFactory} parameters
252+ * and the values of {@link Logger#getName()} and {@link Logger#getMessageFactory()}.
253+ * </p>
250254 *
251255 * @param name a logger name
252256 * @param messageFactory a message factory
@@ -263,9 +267,16 @@ public void putIfAbsent(final String name, @Nullable final MessageFactory messag
263267 try {
264268 final MessageFactory effectiveMessageFactory =
265269 messageFactory != null ? messageFactory : ParameterizedMessageFactory .INSTANCE ;
270+ // Register using the keys provided by the caller
266271 loggerByMessageFactoryByName
267272 .computeIfAbsent (name , this ::createLoggerRefByMessageFactoryMap )
268273 .putIfAbsent (effectiveMessageFactory , logger );
274+ // Also register using the values extracted from `logger`
275+ if (!name .equals (logger .getName ()) || !effectiveMessageFactory .equals (logger .getMessageFactory ())) {
276+ loggerByMessageFactoryByName
277+ .computeIfAbsent (logger .getName (), this ::createLoggerRefByMessageFactoryMap )
278+ .putIfAbsent (logger .getMessageFactory (), logger );
279+ }
269280 } finally {
270281 writeLock .unlock ();
271282 }
0 commit comments