Skip to content

Commit 2062676

Browse files
authored
Implement MessageFactory-namespaced logger registry (#2961)
1 parent 10c5c22 commit 2062676

File tree

18 files changed

+394
-169
lines changed

18 files changed

+394
-169
lines changed

log4j-api/src/main/java/org/apache/logging/log4j/message/LocalizedMessageFactory.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@
1616
*/
1717
package org.apache.logging.log4j.message;
1818

19+
import java.util.Objects;
1920
import java.util.ResourceBundle;
21+
import org.jspecify.annotations.Nullable;
2022

2123
/**
2224
* Creates {@link FormattedMessage} instances for {@link MessageFactory2} methods (and {@link MessageFactory} by
@@ -33,8 +35,11 @@
3335
public class LocalizedMessageFactory extends AbstractMessageFactory {
3436
private static final long serialVersionUID = -1996295808703146741L;
3537

38+
@Nullable
3639
// FIXME: cannot use ResourceBundle name for serialization until Java 8
3740
private final transient ResourceBundle resourceBundle;
41+
42+
@Nullable
3843
private final String baseName;
3944

4045
public LocalizedMessageFactory(final ResourceBundle resourceBundle) {
@@ -92,4 +97,21 @@ public Message newMessage(final String key, final Object... params) {
9297
}
9398
return new LocalizedMessage(resourceBundle, key, params);
9499
}
100+
101+
@Override
102+
public boolean equals(final Object object) {
103+
if (this == object) {
104+
return true;
105+
}
106+
if (object == null || getClass() != object.getClass()) {
107+
return false;
108+
}
109+
final LocalizedMessageFactory that = (LocalizedMessageFactory) object;
110+
return Objects.equals(resourceBundle, that.resourceBundle) && Objects.equals(baseName, that.baseName);
111+
}
112+
113+
@Override
114+
public int hashCode() {
115+
return Objects.hash(resourceBundle, baseName);
116+
}
95117
}

log4j-api/src/main/java/org/apache/logging/log4j/message/package-info.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
* Public Message Types used for Log4j 2. Users may implement their own Messages.
2020
*/
2121
@Export
22-
@Version("2.24.0")
22+
@Version("2.24.1")
2323
package org.apache.logging.log4j.message;
2424

2525
import org.osgi.annotation.bundle.Export;

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

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,13 @@
2020
import java.io.PrintStream;
2121
import org.apache.logging.log4j.Level;
2222
import org.apache.logging.log4j.message.MessageFactory;
23+
import org.apache.logging.log4j.message.ParameterizedMessageFactory;
2324
import org.apache.logging.log4j.simple.internal.SimpleProvider;
24-
import org.apache.logging.log4j.spi.AbstractLogger;
2525
import org.apache.logging.log4j.spi.ExtendedLogger;
2626
import org.apache.logging.log4j.spi.LoggerContext;
2727
import org.apache.logging.log4j.spi.LoggerRegistry;
2828
import org.apache.logging.log4j.util.PropertiesUtil;
29+
import org.jspecify.annotations.Nullable;
2930

3031
/**
3132
* A simple {@link LoggerContext} implementation.
@@ -41,6 +42,8 @@ public class SimpleLoggerContext implements LoggerContext {
4142
/** All system properties used by <code>SimpleLog</code> start with this */
4243
protected static final String SYSTEM_PREFIX = "org.apache.logging.log4j.simplelog.";
4344

45+
private static final MessageFactory DEFAULT_MESSAGE_FACTORY = ParameterizedMessageFactory.INSTANCE;
46+
4447
private final PropertiesUtil props;
4548

4649
/** Include the instance name in the log message? */
@@ -96,14 +99,20 @@ public ExtendedLogger getLogger(final String name) {
9699
}
97100

98101
@Override
99-
public ExtendedLogger getLogger(final String name, final MessageFactory messageFactory) {
100-
// Note: This is the only method where we add entries to the 'loggerRegistry' ivar.
101-
final ExtendedLogger extendedLogger = loggerRegistry.getLogger(name, messageFactory);
102-
if (extendedLogger != null) {
103-
AbstractLogger.checkMessageFactory(extendedLogger, messageFactory);
104-
return extendedLogger;
102+
public ExtendedLogger getLogger(final String name, @Nullable final MessageFactory messageFactory) {
103+
final MessageFactory effectiveMessageFactory =
104+
messageFactory != null ? messageFactory : DEFAULT_MESSAGE_FACTORY;
105+
final ExtendedLogger oldLogger = loggerRegistry.getLogger(name, effectiveMessageFactory);
106+
if (oldLogger != null) {
107+
return oldLogger;
105108
}
106-
final SimpleLogger simpleLogger = new SimpleLogger(
109+
final ExtendedLogger newLogger = createLogger(name, effectiveMessageFactory);
110+
loggerRegistry.putIfAbsent(name, effectiveMessageFactory, newLogger);
111+
return loggerRegistry.getLogger(name, effectiveMessageFactory);
112+
}
113+
114+
private ExtendedLogger createLogger(final String name, @Nullable final MessageFactory messageFactory) {
115+
return new SimpleLogger(
107116
name,
108117
defaultLevel,
109118
showLogName,
@@ -114,8 +123,6 @@ public ExtendedLogger getLogger(final String name, final MessageFactory messageF
114123
messageFactory,
115124
props,
116125
stream);
117-
loggerRegistry.putIfAbsent(name, messageFactory, simpleLogger);
118-
return loggerRegistry.getLogger(name, messageFactory);
119126
}
120127

121128
/**
@@ -131,16 +138,18 @@ public LoggerRegistry<ExtendedLogger> getLoggerRegistry() {
131138

132139
@Override
133140
public boolean hasLogger(final String name) {
134-
return false;
141+
return loggerRegistry.hasLogger(name, DEFAULT_MESSAGE_FACTORY);
135142
}
136143

137144
@Override
138145
public boolean hasLogger(final String name, final Class<? extends MessageFactory> messageFactoryClass) {
139-
return false;
146+
return loggerRegistry.hasLogger(name, messageFactoryClass);
140147
}
141148

142149
@Override
143-
public boolean hasLogger(final String name, final MessageFactory messageFactory) {
144-
return false;
150+
public boolean hasLogger(final String name, @Nullable final MessageFactory messageFactory) {
151+
final MessageFactory effectiveMessageFactory =
152+
messageFactory != null ? messageFactory : DEFAULT_MESSAGE_FACTORY;
153+
return loggerRegistry.hasLogger(name, effectiveMessageFactory);
145154
}
146155
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
* Providers are able to be loaded at runtime.
2121
*/
2222
@Export
23-
@Version("2.24.0")
23+
@Version("2.24.1")
2424
package org.apache.logging.log4j.simple;
2525

2626
import org.osgi.annotation.bundle.Export;

0 commit comments

Comments
 (0)