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 .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 }
0 commit comments