Skip to content

Structured properties API enhancement proposal #1144

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 66 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
66 commits
Select commit Hold shift + click to select a range
a1d395e
Move JsonReader to log4j-api
jvz Nov 21, 2022
6f46c24
Add PropertyResolver API for JSON/Properties parsing
jvz Nov 21, 2022
e64138a
Make config parsing strict
jvz Nov 21, 2022
138444f
Use SetSystemProperty in test
jvz Dec 11, 2022
388554f
Update tests to use simpler injection
jvz Dec 11, 2022
446d504
Add ClassFactory and InstanceFactory SPI
jvz Dec 11, 2022
b6e903d
Clean up unchecked casts
jvz Dec 11, 2022
5fac03c
Clean up unchecked cast
jvz Dec 11, 2022
4759677
Add auto-spotless apply to pom
jvz Dec 11, 2022
50b213e
Improve support for SecurityManager and system properties
jvz Dec 11, 2022
66db7a2
Refactor SSL config plugins to use builders
jvz Dec 12, 2022
0753c24
Add Configuration::getPropertyResolver
jvz Dec 12, 2022
a63b2fc
Mark some APIs as deprecated or internal
jvz Dec 12, 2022
02a0bce
Add PropertyResolver for using a particular context name
jvz Dec 12, 2022
9cf3667
Use PropertyResolver in UuidUtil
jvz Dec 12, 2022
6a3f41d
Use TimeUnit for time constants
jvz Dec 12, 2022
31d420a
Migrate most of log4j-core to new properties system
jvz Dec 12, 2022
c9ff521
Merge branch 'master' into properties
jvz Dec 17, 2022
fba781a
Remove deprecated factory for AuthorizationProvider
jvz Dec 17, 2022
23ed8fc
Replace private empty iterator class with Collections::emptyIterator
jvz Dec 17, 2022
845a079
Add some timeouts for tests that can infinite loop
jvz Dec 18, 2022
dea25d5
Use OutputStream::nullOutputStream cleanups
jvz Dec 18, 2022
86be43c
Migrate test to JUnit 5
jvz Dec 18, 2022
e0004d6
Merge branch 'master' into properties
jvz Dec 27, 2022
00b6fb5
Clarify Key intro docs
jvz Dec 27, 2022
48fcaf2
LOG4J2-3228 - Remove Serializable requirement from Layout
jvz Dec 29, 2022
014824f
Extract default methods for LifeCycle
jvz Dec 29, 2022
197fc2b
LOG4J2-3228 - Remove Serializable from LogEvent and add builder
jvz Dec 30, 2022
fbe0325
Use StandardCharsets constants
jvz Dec 30, 2022
e4f9d92
Miscellaneous cleanups
jvz Dec 30, 2022
465b183
Use ContextSelectorType instead of system property
jvz Dec 30, 2022
401b7e2
Add Closer::closeAllSilently for closing multiple instances
jvz Dec 30, 2022
c0da548
Remove Serializable bound
jvz Dec 30, 2022
9340712
Add timeout to test
jvz Dec 30, 2022
8646e4b
Use relaxed lazy initialization in ThreadContext
jvz Dec 31, 2022
7760302
Improve Key::toString output
jvz Dec 31, 2022
bb35025
Add more assertions
jvz Dec 31, 2022
d328681
Check expected class in PatternParser constructor
jvz Dec 31, 2022
748aa00
Remove NullOutputStream as replaced by java.io.OutputStream::nullOutp…
jvz Dec 31, 2022
d892d44
Update LoggingSystem to allow both the ClassFactory and InstanceFacto…
jvz Dec 31, 2022
36213e2
Update how Injector scopes work
jvz Dec 31, 2022
493bda8
Move Recycler and RecyclerFactory to log4j-api
jvz Dec 31, 2022
49305aa
Integrate Injector, LoggerContext, and Configuration
jvz Jan 1, 2023
fc1bfa1
Merge branch 'master' into properties
jvz Jan 1, 2023
44f43b3
Optimize relaxed compareAndExchange usage
jvz Jan 1, 2023
b6db126
Fix over-revert
jvz Jan 1, 2023
4bf052b
Refactor synchronized to use Lock
jvz Jan 1, 2023
6adfa4d
Fix StrSubstitutorTest to use InterpolatorFactory
jvz Jan 2, 2023
ef272f4
Remove BundleContextSelector
jvz Jan 2, 2023
9463405
Update test fixture implementation
jvz Jan 2, 2023
eb632f0
Add javadoc to ContextSelector
jvz Jan 2, 2023
369e8de
Update TriggeringPolicy to extend LifeCycle
jvz Jan 2, 2023
386d3fc
Remove unused class
jvz Jan 2, 2023
bda50b1
Remove serialization test
jvz Jan 2, 2023
0bcad46
Fix CronTriggeringPolicyTest
jvz Jan 2, 2023
42db240
Clean up injectable stuff
jvz Jan 2, 2023
bdd5543
Fix compile errors
jvz Jan 2, 2023
3d7c15b
Merge branch 'master' into properties
jvz Jan 2, 2023
512814a
Use injectMembers in other ContextSelector implementations
jvz Jan 2, 2023
97a9b47
Move injector::init call before consumer callback
jvz Jan 2, 2023
686a35a
Use LoggingTestContext
jvz Jan 2, 2023
5706f93
Refactor reflection in test to use package-private getters
jvz Jan 2, 2023
c302f0a
Remove redundant binding
jvz Jan 2, 2023
1570567
Use ConfigurationFactory as binding
jvz Jan 2, 2023
4de708a
Initialize ContextData-related classes when null
jvz Jan 2, 2023
35c8700
Merge branch 'master' into properties
jvz Jan 2, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,8 @@
import org.apache.log4j.spi.ThrowableRendererSupport;
import org.apache.logging.log4j.core.config.Configuration;
import org.apache.logging.log4j.core.net.UrlConnectionFactory;
import org.apache.logging.log4j.plugins.di.DI;
import org.apache.logging.log4j.plugins.di.Injector;
import org.apache.logging.log4j.util.StackLocatorUtil;

/**
Expand Down Expand Up @@ -383,7 +385,10 @@ public void doConfigure(final URL url, final LoggerRepository loggerRepository)
Configuration doConfigure(final URL url, final LoggerRepository loggerRepository, final ClassLoader classLoader) {
LogLog.debug("Reading configuration from URL " + url);
try {
final URLConnection urlConnection = UrlConnectionFactory.createConnection(url);
// TODO: find better place to anchor Injector creation
final Injector injector = DI.createInjector();
injector.init();
final URLConnection urlConnection = injector.getInstance(UrlConnectionFactory.class).openConnection(url);
try (InputStream inputStream = urlConnection.getInputStream()) {
return doConfigure(inputStream, loggerRepository, classLoader);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,6 @@
*/
package org.apache.log4j.bridge;

import java.io.Serializable;

import org.apache.log4j.Appender;
import org.apache.logging.log4j.core.Filter;
import org.apache.logging.log4j.core.Layout;
Expand Down Expand Up @@ -76,7 +74,7 @@ public Adapter getAdapter() {

public class Adapter extends AbstractAppender {

protected Adapter(final String name, final Filter filter, final Layout<? extends Serializable> layout,
protected Adapter(final String name, final Filter filter, final Layout<?> layout,
final boolean ignoreExceptions, final Property[] properties) {
super(name, filter, layout, ignoreExceptions, properties);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@
import org.apache.logging.log4j.Marker;
import org.apache.logging.log4j.ThreadContext;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.impl.ThrowableProxy;
import org.apache.logging.log4j.core.ThrowableProxy;
import org.apache.logging.log4j.core.time.Instant;
import org.apache.logging.log4j.core.time.MutableInstant;
import org.apache.logging.log4j.message.Message;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,11 @@
*/
package org.apache.log4j.builders.appender;

import java.util.Properties;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicReference;

import org.apache.log4j.Appender;
import org.apache.log4j.Layout;
import org.apache.log4j.bridge.AppenderWrapper;
Expand All @@ -38,11 +43,6 @@
import org.apache.logging.log4j.status.StatusLogger;
import org.w3c.dom.Element;

import java.util.Properties;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicReference;

import static org.apache.log4j.builders.BuilderManager.NAMESPACE;
import static org.apache.log4j.config.Log4j1Configuration.THRESHOLD_PARAM;
import static org.apache.log4j.xml.XmlConfiguration.*;
Expand Down Expand Up @@ -115,7 +115,7 @@ public Appender parseAppender(final Element appenderElement, final XmlConfigurat
});
return createAppender(name, layout.get(), filter.get(), fileName.get(), append.get(), immediateFlush.get(),
level.get(), bufferedIo.get(), bufferSize.get(), datePattern.get(), config,
config.getComponent(Clock.KEY));
config.getInstance(Clock.class));
}

@Override
Expand All @@ -131,7 +131,7 @@ public Appender parseAppender(final String name, final String appenderPrefix, fi
final int bufferSize = getIntegerProperty(BUFFER_SIZE_PARAM, 8192);
final String datePattern = getProperty(DATE_PATTERN_PARAM, DEFAULT_DATE_PATTERN);
return createAppender(name, layout, filter, fileName, append, immediateFlush, level, bufferedIo, bufferSize,
datePattern, configuration, configuration.getComponent(Clock.KEY));
datePattern, configuration, configuration.getInstance(Clock.class));
}

private <T extends Log4j1Configuration> Appender createAppender(final String name, final Layout layout,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,11 @@
*/
package org.apache.log4j.builders.appender;

import java.util.Properties;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicReference;

import org.apache.log4j.Appender;
import org.apache.log4j.Layout;
import org.apache.log4j.bridge.AppenderWrapper;
Expand All @@ -39,11 +44,6 @@
import org.apache.logging.log4j.status.StatusLogger;
import org.w3c.dom.Element;

import java.util.Properties;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicReference;

import static org.apache.log4j.builders.BuilderManager.NAMESPACE;
import static org.apache.log4j.config.Log4j1Configuration.THRESHOLD_PARAM;
import static org.apache.log4j.xml.XmlConfiguration.*;
Expand Down Expand Up @@ -120,7 +120,7 @@ public Appender parseAppender(final Element appenderElement, final XmlConfigurat
});
return createAppender(name, config, layout.get(), filter.get(), append.get(), bufferedIo.get(),
bufferSize.get(), immediateFlush.get(), fileName.get(), level.get(), maxSize.get(), maxBackups.get(),
config.getComponent(Clock.KEY));
config.getInstance(Clock.class));
}

@Override
Expand All @@ -137,7 +137,7 @@ public Appender parseAppender(final String name, final String appenderPrefix, fi
final String maxSize = getProperty(MAX_SIZE_PARAM, DEFAULT_MAX_SIZE);
final String maxBackups = getProperty(MAX_BACKUP_INDEX, DEFAULT_MAX_BACKUPS);
return createAppender(name, configuration, layout, filter, append, bufferedIo, bufferSize, immediateFlush,
fileName, level, maxSize, maxBackups, configuration.getComponent(Clock.KEY));
fileName, level, maxSize, maxBackups, configuration.getInstance(Clock.class));
}

private Appender createAppender(final String name, final Log4j1Configuration config, final Layout layout,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,11 @@
*/
package org.apache.log4j.builders.appender;

import java.util.Properties;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicReference;

import org.apache.log4j.Appender;
import org.apache.log4j.Layout;
import org.apache.log4j.bridge.AppenderWrapper;
Expand All @@ -36,12 +41,6 @@
import org.apache.logging.log4j.util.Strings;
import org.w3c.dom.Element;

import java.io.Serializable;
import java.util.Properties;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicReference;

import static org.apache.log4j.builders.BuilderManager.NAMESPACE;
import static org.apache.log4j.config.Log4j1Configuration.THRESHOLD_PARAM;
import static org.apache.log4j.xml.XmlConfiguration.*;
Expand Down Expand Up @@ -141,7 +140,7 @@ private Appender createAppender(final String name, final Log4j1Configuration con
final AtomicReference<String> host = new AtomicReference<>();
final AtomicInteger port = new AtomicInteger();
resolveSyslogHost(syslogHost, host, port);
final org.apache.logging.log4j.core.Layout<? extends Serializable> messageLayout = LayoutAdapter.adapt(layout);
final org.apache.logging.log4j.core.Layout<?> messageLayout = LayoutAdapter.adapt(layout);
final Log4j1SyslogLayout appenderLayout = Log4j1SyslogLayout.newBuilder()
.setHeader(header)
.setFacility(Facility.toFacility(facility))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@
*/
public class Log4j1Configuration extends AbstractConfiguration implements Reconfigurable {

public static final String MONITOR_INTERVAL = "log4j1.monitorInterval";
public static final String MONITOR_INTERVAL = "log4j2.*.V1Compatibility.monitorInterval";
public static final String APPENDER_REF_TAG = "appender-ref";
public static final String THRESHOLD_PARAM = "Threshold";

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -368,7 +368,12 @@ private void parseLoggers(final Properties props) {
LoggerConfig loggerConfig = getLogger(loggerName);
if (loggerConfig == null) {
final boolean additivity = getAdditivityForLogger(props, loggerName);
loggerConfig = new LoggerConfig(loggerName, org.apache.logging.log4j.Level.ERROR, additivity);
loggerConfig = LoggerConfig.newBuilder()
.setLoggerName(loggerName)
.setLevel(org.apache.logging.log4j.Level.ERROR)
.setAdditivity(additivity)
.setConfig(this)
.get();
addLogger(loggerName, loggerConfig);
}
parseLogger(props, loggerConfig, key, loggerName, value);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
import org.apache.logging.log4j.core.config.Order;
import org.apache.logging.log4j.plugins.Namespace;
import org.apache.logging.log4j.plugins.Plugin;
import org.apache.logging.log4j.util.PropertiesUtil;
import org.apache.logging.log4j.util.PropertyResolver;

/**
* Configures Log4j from a log4j 1 format properties file.
Expand All @@ -47,15 +47,16 @@ public class PropertiesConfigurationFactory extends ConfigurationFactory {

@Override
protected String[] getSupportedTypes() {
if (!PropertiesUtil.getProperties().getBooleanProperty(ConfigurationFactory.LOG4J1_EXPERIMENTAL, Boolean.FALSE)) {
if (!propertyResolver.getBoolean(ConfigurationFactory.LOG4J1_EXPERIMENTAL)) {
return null;
}
return new String[] { FILE_EXTENSION };
}

@Override
public Configuration getConfiguration(LoggerContext loggerContext, ConfigurationSource source) {
int interval = PropertiesUtil.getProperties().getIntegerProperty(Log4j1Configuration.MONITOR_INTERVAL, 0);
final PropertyResolver propertyResolver = loggerContext != null ? loggerContext.getPropertyResolver() : this.propertyResolver;
int interval = propertyResolver.getInt(Log4j1Configuration.MONITOR_INTERVAL).orElse(0);
return new PropertiesConfiguration(loggerContext, source, interval);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@
*/
package org.apache.log4j.layout;

import java.io.Serializable;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
Expand Down Expand Up @@ -76,7 +75,7 @@ public Builder() {
private boolean header;

@PluginElement("Layout")
private Layout<? extends Serializable> messageLayout;
private Layout<?> messageLayout;

@Override
public Log4j1SyslogLayout build() {
Expand All @@ -99,7 +98,7 @@ public boolean isHeader() {
return header;
}

public Layout<? extends Serializable> getMessageLayout() {
public Layout<?> getMessageLayout() {
return messageLayout;
}

Expand All @@ -118,7 +117,7 @@ public B setHeader(final boolean header) {
return asBuilder();
}

public B setMessageLayout(final Layout<? extends Serializable> messageLayout) {
public B setMessageLayout(final Layout<?> messageLayout) {
this.messageLayout = messageLayout;
return asBuilder();
}
Expand Down Expand Up @@ -192,7 +191,9 @@ public String toSerializable(final LogEvent event) {

buf.append(message);
// TODO: splitting message into 1024 byte chunks?
return buf.toString();
final String result = buf.toString();
recycleStringBuilder(buf);
return result;
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -78,13 +78,16 @@ public void encode(final LogEvent event, final ByteBufferDestination destination
final StringBuilder text = getStringBuilder();
formatTo(event, text);
getStringBuilderEncoder().encode(text, destination);
recycleStringBuilder(text);
}

@Override
public String toSerializable(final LogEvent event) {
final StringBuilder text = getStringBuilder();
formatTo(event, text);
return text.toString();
final String result = text.toString();
recycleStringBuilder(text);
return result;
}

private void formatTo(final LogEvent event, final StringBuilder buf) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,10 @@
import org.apache.log4j.spi.LocationInfo;
import org.apache.log4j.spi.LoggingEvent;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.impl.Log4jLogEvent;
import org.apache.logging.log4j.message.MapMessage;
import org.apache.logging.log4j.message.Message;
import org.apache.logging.log4j.message.SimpleMessage;
import org.apache.logging.log4j.util.Cast;
import org.apache.logging.log4j.util.SortedArrayStringMap;

/**
Expand All @@ -54,10 +54,9 @@ public class MapRewritePolicy implements RewritePolicy {
public LoggingEvent rewrite(final LoggingEvent source) {
Object msg = source.getMessage();
if (msg instanceof MapMessage || msg instanceof Map) {
Map<String, String> props = source.getProperties() != null ? new HashMap<>(source.getProperties())
Map<String, String> props = source.getProperties() != null ? new HashMap<>(Cast.cast(source.getProperties()))
: new HashMap<>();
@SuppressWarnings("unchecked")
Map<String, Object> eventProps = msg instanceof Map ? (Map) msg : ((MapMessage) msg).getData();
Map<String, Object> eventProps = Cast.cast(msg instanceof Map ? msg : ((MapMessage<?, ?>) msg).getData());
//
// if the map sent in the logging request
// has "message" entry, use that as the message body
Expand All @@ -78,22 +77,21 @@ public LoggingEvent rewrite(final LoggingEvent source) {

LogEvent event;
if (source instanceof LogEventAdapter) {
event = new Log4jLogEvent.Builder(((LogEventAdapter) source).getEvent())
event = LogEvent.builderFrom(((LogEventAdapter) source).getEvent())
.setMessage(newMessage)
.setContextData(new SortedArrayStringMap(props))
.build();
.toImmutable();
} else {
LocationInfo info = source.getLocationInformation();
StackTraceElement element = new StackTraceElement(info.getClassName(), info.getMethodName(),
info.getFileName(), Integer.parseInt(info.getLineNumber()));
Thread thread = getThread(source.getThreadName());
long threadId = thread != null ? thread.getId() : 0;
int threadPriority = thread != null ? thread.getPriority() : 0;
event = Log4jLogEvent.newBuilder()
event = LogEvent.builder()
.setContextData(new SortedArrayStringMap(props))
.setLevel(OptionConverter.convertLevel(source.getLevel()))
.setLoggerFqcn(source.getFQNOfLoggerClass())
.setMarker(null)
.setMessage(newMessage)
.setSource(element)
.setLoggerName(source.getLoggerName())
Expand All @@ -102,9 +100,7 @@ public LoggingEvent rewrite(final LoggingEvent source) {
.setThreadPriority(threadPriority)
.setThrown(source.getThrowableInformation().getThrowable())
.setTimeMillis(source.getTimeStamp())
.setNanoTime(0)
.setThrownProxy(null)
.build();
.toImmutable();
}
return new LogEventAdapter(event);
}
Expand Down
Loading