Skip to content

Commit 602bf88

Browse files
committed
Improvements on the logger message factory namespacing (#2936)
1 parent 63e6592 commit 602bf88

File tree

8 files changed

+72
-35
lines changed

8 files changed

+72
-35
lines changed

log4j-api/src/main/java/org/apache/logging/log4j/simple/SimpleLoggerContext.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ public Object getExternalContext() {
9595

9696
@Override
9797
public ExtendedLogger getLogger(final String name) {
98-
return getLogger(name, null);
98+
return getLogger(name, DEFAULT_MESSAGE_FACTORY);
9999
}
100100

101101
@Override

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

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -259,26 +259,29 @@ public boolean hasLogger(final String name, final Class<? extends MessageFactory
259259
}
260260

261261
/**
262-
* Registers the provided logger using the given name – <b>message factory parameter is ignored</b> and the one from the logger will be used instead.
262+
* Registers the provided logger.
263+
* <b>Logger name and message factory parameters are ignored</b>, those will be obtained from the logger instead.
263264
*
264-
* @param name a logger name
265+
* @param name ignored – kept for backward compatibility
265266
* @param messageFactory ignored – kept for backward compatibility
266267
* @param logger a logger instance
267268
* @deprecated As of version {@code 2.25.0}, planned to be removed!
268269
* Use {@link #computeIfAbsent(String, MessageFactory, BiFunction)} instead.
269270
*/
270271
@Deprecated
271-
public void putIfAbsent(final String name, @Nullable final MessageFactory messageFactory, final T logger) {
272+
public void putIfAbsent(
273+
@Nullable final String name, @Nullable final MessageFactory messageFactory, final T logger) {
272274

273275
// Check arguments
274-
requireNonNull(name, "name");
275276
requireNonNull(logger, "logger");
276277

277278
// Insert the logger
278279
writeLock.lock();
279280
try {
281+
final String loggerName = logger.getName();
280282
final Map<MessageFactory, WeakReference<T>> loggerRefByMessageFactory =
281-
loggerRefByMessageFactoryByName.computeIfAbsent(name, this::createLoggerRefByMessageFactoryMap);
283+
loggerRefByMessageFactoryByName.computeIfAbsent(
284+
loggerName, this::createLoggerRefByMessageFactoryMap);
282285
final MessageFactory loggerMessageFactory = logger.getMessageFactory();
283286
final WeakReference<T> loggerRef = loggerRefByMessageFactory.get(loggerMessageFactory);
284287
if (loggerRef == null || loggerRef.get() == null) {
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
/*
2+
* Licensed to the Apache Software Foundation (ASF) under one or more
3+
* contributor license agreements. See the NOTICE file distributed with
4+
* this work for additional information regarding copyright ownership.
5+
* The ASF licenses this file to you under the Apache License, Version 2.0
6+
* (the "License"); you may not use this file except in compliance with
7+
* the License. You may obtain a copy of the License at
8+
*
9+
* http://www.apache.org/licenses/LICENSE-2.0
10+
*
11+
* Unless required by applicable law or agreed to in writing, software
12+
* distributed under the License is distributed on an "AS IS" BASIS,
13+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
* See the License for the specific language governing permissions and
15+
* limitations under the License.
16+
*/
17+
package org.apache.logging.log4j.core;
18+
19+
import static org.assertj.core.api.Assertions.assertThat;
20+
import static org.mockito.Mockito.mock;
21+
22+
import org.apache.logging.log4j.message.MessageFactory;
23+
import org.apache.logging.log4j.message.MessageFactory2;
24+
import org.junit.jupiter.api.Test;
25+
import org.junit.jupiter.api.TestInfo;
26+
27+
class LoggerContextTest {
28+
29+
@Test
30+
void newInstance_should_honor_name_and_message_factory(final TestInfo testInfo) {
31+
final String testName = testInfo.getDisplayName();
32+
try (final LoggerContext loggerContext = new LoggerContext(testName)) {
33+
final String loggerName = testName + "-loggerName";
34+
final MessageFactory2 messageFactory = mock(MessageFactory2.class);
35+
final Logger logger = loggerContext.newInstance(loggerContext, loggerName, messageFactory);
36+
assertThat(logger.getName()).isEqualTo(loggerName);
37+
assertThat((MessageFactory) logger.getMessageFactory()).isSameAs(messageFactory);
38+
}
39+
}
40+
}

log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerContextTest.java

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,23 +16,30 @@
1616
*/
1717
package org.apache.logging.log4j.core.async;
1818

19-
import static org.junit.Assert.assertTrue;
19+
import static org.assertj.core.api.Assertions.assertThat;
20+
import static org.mockito.Mockito.mock;
2021

2122
import org.apache.logging.log4j.Logger;
22-
import org.apache.logging.log4j.core.LoggerContext;
23-
import org.apache.logging.log4j.core.test.CoreLoggerContexts;
2423
import org.apache.logging.log4j.core.test.categories.AsyncLoggers;
25-
import org.junit.Test;
24+
import org.apache.logging.log4j.message.MessageFactory;
25+
import org.apache.logging.log4j.message.MessageFactory2;
2626
import org.junit.experimental.categories.Category;
27+
import org.junit.jupiter.api.Test;
28+
import org.junit.jupiter.api.TestInfo;
2729

2830
@Category(AsyncLoggers.class)
29-
public class AsyncLoggerContextTest {
31+
class AsyncLoggerContextTest {
3032

3133
@Test
32-
public void testNewInstanceReturnsAsyncLogger() {
33-
final Logger logger = new AsyncLoggerContext("a").newInstance(new LoggerContext("a"), "a", null);
34-
assertTrue(logger instanceof AsyncLogger);
35-
36-
CoreLoggerContexts.stopLoggerContext(); // stop async thread
34+
void verify_newInstance(final TestInfo testInfo) {
35+
final String testName = testInfo.getDisplayName();
36+
try (final AsyncLoggerContext loggerContext = new AsyncLoggerContext(testName)) {
37+
final String loggerName = testName + "-loggerName";
38+
final MessageFactory2 messageFactory = mock(MessageFactory2.class);
39+
final Logger logger = loggerContext.newInstance(loggerContext, loggerName, messageFactory);
40+
assertThat(logger).isInstanceOf(AsyncLogger.class);
41+
assertThat(logger.getName()).isEqualTo(loggerName);
42+
assertThat((MessageFactory) logger.getMessageFactory()).isSameAs(messageFactory);
43+
}
3744
}
3845
}

log4j-core/src/main/java/org/apache/logging/log4j/core/LoggerContext.java

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,6 @@
5454
import org.apache.logging.log4j.spi.LoggerRegistry;
5555
import org.apache.logging.log4j.spi.Terminable;
5656
import org.apache.logging.log4j.spi.ThreadContextMapFactory;
57-
import org.apache.logging.log4j.status.StatusLogger;
5857
import org.apache.logging.log4j.util.PropertiesUtil;
5958
import org.jspecify.annotations.Nullable;
6059

@@ -506,7 +505,7 @@ public Object getExternalContext() {
506505
*/
507506
@Override
508507
public Logger getLogger(final String name) {
509-
return getLogger(name, null);
508+
return getLogger(name, DEFAULT_MESSAGE_FACTORY);
510509
}
511510

512511
/**
@@ -815,19 +814,7 @@ private void initApiModule() {
815814
}
816815

817816
private Logger newInstance(final String name, final MessageFactory messageFactory) {
818-
final Logger logger = newInstance(this, name, messageFactory);
819-
final MessageFactory loggerMessageFactory = logger.getMessageFactory();
820-
if (!loggerMessageFactory.equals(messageFactory)) {
821-
StatusLogger.getLogger()
822-
.error(
823-
"Newly created logger with name `{}` and message factory `{}` was actually requested to be created with a different message factory: `{}`.\n"
824-
+ "This generally hints a problem.\n"
825-
+ "Please report this using the Log4j project issue tracker.",
826-
name,
827-
loggerMessageFactory,
828-
messageFactory);
829-
}
830-
return logger;
817+
return newInstance(this, name, messageFactory);
831818
}
832819

833820
// LOG4J2-151: changed visibility from private to protected

log4j-taglib/src/main/java/org/apache/logging/log4j/taglib/Log4jTaglibLoggerContext.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ public Object getExternalContext() {
6666

6767
@Override
6868
public Log4jTaglibLogger getLogger(final String name) {
69-
return getLogger(name, null);
69+
return getLogger(name, DEFAULT_MESSAGE_FACTORY);
7070
}
7171

7272
@Override
@@ -84,7 +84,7 @@ private Log4jTaglibLogger createLogger(final String name, @Nullable final Messag
8484

8585
@Override
8686
public boolean hasLogger(final String name) {
87-
return loggerRegistry.hasLogger(name);
87+
return loggerRegistry.hasLogger(name, DEFAULT_MESSAGE_FACTORY);
8888
}
8989

9090
@Override

log4j-to-jul/src/main/java/org/apache/logging/log4j/tojul/JULLoggerContext.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ public Object getExternalContext() {
4545

4646
@Override
4747
public ExtendedLogger getLogger(final String name) {
48-
return getLogger(name, null);
48+
return getLogger(name, DEFAULT_MESSAGE_FACTORY);
4949
}
5050

5151
@Override

log4j-to-slf4j/src/main/java/org/apache/logging/slf4j/SLF4JLoggerContext.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ public Object getExternalContext() {
3838

3939
@Override
4040
public ExtendedLogger getLogger(final String name) {
41-
return getLogger(name, null);
41+
return getLogger(name, DEFAULT_MESSAGE_FACTORY);
4242
}
4343

4444
@Override

0 commit comments

Comments
 (0)