Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -19,14 +19,19 @@
import static org.apache.logging.log4j.util.Unbox.box;
import static org.junit.jupiter.api.Assertions.assertAll;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertInstanceOf;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;

import java.io.IOException;
import java.net.URI;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Arrays;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
Expand All @@ -36,6 +41,7 @@
import org.apache.logging.log4j.core.Logger;
import org.apache.logging.log4j.core.LoggerContext;
import org.apache.logging.log4j.core.appender.ConsoleAppender;
import org.apache.logging.log4j.core.config.composite.CompositeConfiguration;
import org.apache.logging.log4j.core.filter.ThreadContextMapFilter;
import org.apache.logging.log4j.core.test.junit.LoggerContextSource;
import org.apache.logging.log4j.test.junit.TempLoggingDir;
Expand Down Expand Up @@ -130,4 +136,63 @@ void properties(final LoggerContext context) throws IOException {
final Path logFile = loggingPath.resolve("test-properties.log");
checkFileLogger(context, logFile);
}

@Test
void testGetConfigurationWithNullUris() {
final ConfigurationFactory factory = ConfigurationFactory.getInstance();
try (final LoggerContext context = new LoggerContext("test")) {
assertThrows(NullPointerException.class, () -> factory.getConfiguration(context, "test", (List<URI>) null));
}
}

@Test
void testGetConfigurationWithEmptyUris() {
final ConfigurationFactory factory = ConfigurationFactory.getInstance();
try (final LoggerContext context = new LoggerContext("test")) {
assertThrows(
IllegalArgumentException.class,
() -> factory.getConfiguration(context, "test", Collections.emptyList()));
}
}

@Test
void testGetConfigurationWithNullInList() {
final ConfigurationFactory factory = ConfigurationFactory.getInstance();
try (final LoggerContext context = new LoggerContext("test")) {
final List<URI> listWithNull = Collections.singletonList(null);
assertThrows(ConfigurationException.class, () -> factory.getConfiguration(context, "test", listWithNull));
}
}

@Test
void testGetConfigurationWithSingleUri() throws Exception {
final ConfigurationFactory factory = ConfigurationFactory.getInstance();
try (final LoggerContext context = new LoggerContext("test")) {
final URL resource = getClass().getResource("/log4j-test1.xml");
assertNotNull(resource);

final List<URI> singleUri = Collections.singletonList(resource.toURI());
final Configuration config = factory.getConfiguration(context, "test", singleUri);

assertNotNull(config);
assertFalse(config instanceof CompositeConfiguration);
}
}

@Test
void testGetConfigurationWithMultipleUris() throws Exception {
final ConfigurationFactory factory = ConfigurationFactory.getInstance();
try (final LoggerContext context = new LoggerContext("test")) {
final URL resource1 = getClass().getResource("/log4j-test1.xml");
final URL resource2 = getClass().getResource("/log4j-xinclude.xml");
assertNotNull(resource1);
assertNotNull(resource2);

final List<URI> multipleUris = Arrays.asList(resource1.toURI(), resource2.toURI());
final Configuration config = factory.getConfiguration(context, "test", multipleUris);

assertNotNull(config);
assertTrue(config instanceof CompositeConfiguration);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ static Configuration addTestFixtures(final String name, final ConfigurationBuild

@Override
public Configuration getConfiguration(final LoggerContext loggerContext, final ConfigurationSource source) {
return getConfiguration(loggerContext, source.toString(), null);
return getConfiguration(loggerContext, source.toString(), (URI) null);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import org.apache.logging.log4j.Level;
Expand Down Expand Up @@ -333,6 +334,52 @@ public Configuration getConfiguration(
return getConfiguration(loggerContext, name, configLocation);
}

/**
* Creates a Configuration from multiple configuration URIs.
* If multiple URIs are successfully loaded, they will be combined into a CompositeConfiguration.
*
* @param loggerContext the logger context (may be null)
* @param name the configuration name (may be null)
* @param uris the list of configuration URIs (must not be null or empty)
* @return a Configuration created from the provided URIs
* @throws NullPointerException if uris is null
* @throws IllegalArgumentException if uris is empty
* @throws ConfigurationException if no valid configuration could be created
* from any of the provided URIs
* @since 2.26.0
*/
public Configuration getConfiguration(final LoggerContext loggerContext, final String name, final List<URI> uris) {

Objects.requireNonNull(uris, "uris parameter cannot be null");

if (uris.isEmpty()) {
throw new IllegalArgumentException("URI list cannot be empty");
}

final List<AbstractConfiguration> configurations = new ArrayList<>();

for (final URI uri : uris) {

if (uri == null) {
throw new ConfigurationException("URI list contains null element");
}

final Configuration config = getConfiguration(loggerContext, name, uri);

if (config == null) {
throw new ConfigurationException("Failed to create configuration from: " + uri);
}

if (!(config instanceof AbstractConfiguration)) {
throw new ConfigurationException("Configuration at " + uri + " is not an AbstractConfiguration");
}

configurations.add((AbstractConfiguration) config);
}

return configurations.size() == 1 ? configurations.get(0) : new CompositeConfiguration(configurations);
}

static boolean isClassLoaderUri(final URI uri) {
if (uri == null) {
return false;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
* Classes and interfaces supporting configuration of Log4j 2 with JSON.
*/
@Export
@Version("2.20.1")
@Version("2.26.0")
package org.apache.logging.log4j.core.config.json;

import org.osgi.annotation.bundle.Export;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
* Configuration using Properties files.
*/
@Export
@Version("2.20.1")
@Version("2.26.0")
package org.apache.logging.log4j.core.config.properties;

import org.osgi.annotation.bundle.Export;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
* Classes and interfaces supporting configuration of Log4j 2 with XML.
*/
@Export
@Version("2.20.2")
@Version("2.26.0")
package org.apache.logging.log4j.core.config.xml;

import org.osgi.annotation.bundle.Export;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
* Classes and interfaces supporting configuration of Log4j 2 with YAML.
*/
@Export
@Version("2.20.1")
@Version("2.26.0")
package org.apache.logging.log4j.core.config.yaml;

import org.osgi.annotation.bundle.Export;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<entry xmlns="https://logging.apache.org/xml/ns"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
https://logging.apache.org/xml/ns
https://logging.apache.org/xml/ns/log4j-changelog-0.xsd"
type="added">
<issue id="3775" link="https://github.com/apache/logging-log4j2/issues/3775"/>
<issue id="3921" link="https://github.com/apache/logging-log4j2/pull/3921"/>
<description format="asciidoc">
Add a new `ConfigurationFactory::getConfiguration` method accepting multiple `URI`s
</description>
</entry>