Skip to content

Add API to list supported configuration file extensions #3839

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

Open
wants to merge 1 commit into
base: 2.x
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
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 @@ -18,6 +18,8 @@

import java.io.IOException;
import java.io.InputStream;
import java.util.Collections;
import java.util.List;
import org.apache.logging.log4j.core.LoggerContext;
import org.apache.logging.log4j.core.config.Configuration;
import org.apache.logging.log4j.core.config.ConfigurationException;
Expand Down Expand Up @@ -53,4 +55,9 @@ public Configuration getConfiguration(final LoggerContext loggerContext, final C
protected String[] getSupportedTypes() {
return SUFFIXES;
}

@Override
public List<String> getSupportedExtensions() {
return Collections.emptyList();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@
*/
package org.apache.log4j.config;

import java.util.Collections;
import java.util.List;
import org.apache.logging.log4j.core.LoggerContext;
import org.apache.logging.log4j.core.config.Configuration;
import org.apache.logging.log4j.core.config.ConfigurationFactory;
Expand Down Expand Up @@ -52,6 +54,11 @@ protected String[] getSupportedTypes() {
return new String[] {FILE_EXTENSION};
}

@Override
public List<String> getSupportedExtensions() {
return Collections.emptyList();
}

@Override
public Configuration getConfiguration(final LoggerContext loggerContext, final ConfigurationSource source) {
final int interval = PropertiesUtil.getProperties().getIntegerProperty(Log4j1Configuration.MONITOR_INTERVAL, 0);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
* Log4j 1.x compatibility layer.
*/
@Export
@Version("2.20.1")
@Version("2.21.0")
@Open("org.apache.logging.log4j.core")
package org.apache.log4j.config;

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

import java.util.Collections;
import java.util.List;
import org.apache.log4j.config.Log4j1Configuration;
import org.apache.logging.log4j.core.LoggerContext;
import org.apache.logging.log4j.core.config.Configuration;
Expand Down Expand Up @@ -56,6 +58,11 @@ protected String[] getSupportedTypes() {
return new String[] {FILE_EXTENSION};
}

@Override
public List<String> getSupportedExtensions() {
return Collections.emptyList();
}

@Override
public Configuration getConfiguration(final LoggerContext loggerContext, final ConfigurationSource source) {
final int interval = PropertiesUtil.getProperties().getIntegerProperty(Log4j1Configuration.MONITOR_INTERVAL, 0);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
* Log4j 1.x compatibility layer.
*/
@Export
@Version("2.20.2")
@Version("2.21.0")
package org.apache.log4j.xml;

import org.osgi.annotation.bundle.Export;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@
package org.apache.log4j;

import java.net.URI;
import java.util.Collections;
import java.util.List;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.core.LoggerContext;
import org.apache.logging.log4j.core.config.AbstractConfiguration;
Expand All @@ -35,6 +37,11 @@ public String[] getSupportedTypes() {
return new String[] {"*"};
}

@Override
public List<String> getSupportedExtensions() {
return Collections.emptyList();
}

@Override
public Configuration getConfiguration(final LoggerContext loggerContext, final ConfigurationSource source) {
return new BasicConfiguration(loggerContext);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@
package org.apache.logging.log4j.core.test;

import java.net.URI;
import java.util.Collections;
import java.util.List;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.core.LoggerContext;
import org.apache.logging.log4j.core.config.AbstractConfiguration;
Expand All @@ -41,6 +43,11 @@ public String[] getSupportedTypes() {
return null;
}

@Override
public List<String> getSupportedExtensions() {
return Collections.emptyList();
}

@Override
public Configuration getConfiguration(final LoggerContext loggerContext, final ConfigurationSource source) {
return null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
* limitations under the license.
*/
@Export
@Version("2.25.0")
@Version("2.26.0")
@BaselineIgnore("2.25.0")
package org.apache.logging.log4j.core.test;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
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;
Expand All @@ -36,6 +37,10 @@
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.json.JsonConfigurationFactory;
import org.apache.logging.log4j.core.config.properties.PropertiesConfigurationFactory;
import org.apache.logging.log4j.core.config.xml.XmlConfigurationFactory;
import org.apache.logging.log4j.core.config.yaml.YamlConfigurationFactory;
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 +135,55 @@ void properties(final LoggerContext context) throws IOException {
final Path logFile = loggingPath.resolve("test-properties.log");
checkFileLogger(context, logFile);
}

@Test
void getSupportedExtensions() {
final List<String> extensions = ConfigurationFactory.getActiveFileExtensions();
assertNotNull(extensions);
assertFalse(extensions.isEmpty());
assertTrue(extensions.contains("xml"));
assertTrue(extensions.contains("properties"));
final long distinctCount = extensions.stream().distinct().count();
assertEquals(extensions.size(), distinctCount);
}

@Test
void xmlConfigurationFactoryExtensions() {
final XmlConfigurationFactory factory = new XmlConfigurationFactory();
final List<String> extensions = factory.getSupportedExtensions();
assertEquals(1, extensions.size());
assertEquals("xml", extensions.get(0));
}

@Test
void propertiesConfigurationFactoryExtensions() {
final PropertiesConfigurationFactory factory = new PropertiesConfigurationFactory();
final List<String> extensions = factory.getSupportedExtensions();
assertEquals(1, extensions.size());
assertEquals("properties", extensions.get(0));
}

@Test
@Tag("json")
void jsonConfigurationFactoryExtensions() {
final JsonConfigurationFactory factory = new JsonConfigurationFactory();
final List<String> extensions = factory.getSupportedExtensions();
assertTrue(extensions.size() == 0 || extensions.size() == 2);
if (!extensions.isEmpty()) {
assertTrue(extensions.contains("json"));
assertTrue(extensions.contains("jsn"));
}
}

@Test
@Tag("yaml")
void yamlConfigurationFactoryExtensions() {
final YamlConfigurationFactory factory = new YamlConfigurationFactory();
final List<String> extensions = factory.getSupportedExtensions();
assertTrue(extensions.size() == 0 || extensions.size() == 2);
if (!extensions.isEmpty()) {
assertTrue(extensions.contains("yml"));
assertTrue(extensions.contains("yaml"));
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@
package org.apache.logging.log4j.core.config.builder;

import java.net.URI;
import java.util.Collections;
import java.util.List;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.core.Filter;
import org.apache.logging.log4j.core.LoggerContext;
Expand Down Expand Up @@ -86,4 +88,9 @@ public Configuration getConfiguration(
protected String[] getSupportedTypes() {
return new String[] {"*"};
}

@Override
public List<String> getSupportedExtensions() {
return Collections.emptyList();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
import java.util.Map;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.stream.Collectors;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.LoggerContext;
Expand Down Expand Up @@ -263,6 +264,14 @@ public static void removeConfigurationFactory(final ConfigurationFactory factory

protected abstract String[] getSupportedTypes();

/**
* Returns the file extensions supported by this configuration factory.
*
* @return list of supported file extensions (e.g., ["xml", "json"])
* @since 2.25.0
*/
public abstract List<String> getSupportedExtensions();

protected String getTestPrefix() {
return TEST_PREFIX;
}
Expand Down Expand Up @@ -553,6 +562,16 @@ public String[] getSupportedTypes() {
return null;
}

@Override
public List<String> getSupportedExtensions() {
return getFactories().stream()
.filter(factory -> factory != this)
.filter(ConfigurationFactory::isActive)
.flatMap(factory -> factory.getSupportedExtensions().stream())
.distinct()
.collect(Collectors.toList());
}

@Override
public Configuration getConfiguration(final LoggerContext loggerContext, final ConfigurationSource source) {
if (source != null) {
Expand Down Expand Up @@ -617,4 +636,19 @@ private String[] parseConfigLocations(final String configLocations) {
static List<ConfigurationFactory> getFactories() {
return factories;
}

/**
* Returns all configuration file extensions currently supported at runtime.
* This aggregates extensions from all active configuration factories.
*
* @return list of supported file extensions
* @since 2.25.0
*/
public static List<String> getActiveFileExtensions() {
return getFactories().stream()
.filter(ConfigurationFactory::isActive)
.flatMap(factory -> factory.getSupportedExtensions().stream())
.distinct()
.collect(Collectors.toList());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@
*/
package org.apache.logging.log4j.core.config.json;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import org.apache.logging.log4j.core.LoggerContext;
import org.apache.logging.log4j.core.config.Configuration;
import org.apache.logging.log4j.core.config.ConfigurationFactory;
Expand Down Expand Up @@ -71,4 +74,22 @@ public Configuration getConfiguration(final LoggerContext loggerContext, final C
public String[] getSupportedTypes() {
return SUFFIXES;
}

/**
* Returns the file extensions supported by this JSON configuration factory.
*
* <p>This method returns JSON file extensions that this factory can process.
* The factory requires Jackson dependencies to be available on the classpath.
* If Jackson libraries are missing, this method returns an empty list.</p>
*
* @return a list containing "json" and "jsn" extensions if Jackson dependencies
* are available and the factory is active, empty list otherwise
*/
@Override
public List<String> getSupportedExtensions() {
if (!isActive()) {
return Collections.emptyList();
}
return Arrays.asList("json", "jsn");
}
}
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.21.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,6 +18,9 @@

import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Properties;
import org.apache.logging.log4j.core.LoggerContext;
import org.apache.logging.log4j.core.config.ConfigurationException;
Expand All @@ -40,6 +43,24 @@ protected String[] getSupportedTypes() {
return new String[] {".properties"};
}

/**
* Returns the file extensions supported by this Properties configuration factory.
*
* <p>This method returns Properties file extensions that this factory can process.
* The factory supports standard Java properties files used for Log4j 2 configuration.
* No external dependencies are required for properties file support.</p>
*
* @return a list containing "properties" extension if the factory is active,
* empty list if inactive
*/
@Override
public List<String> getSupportedExtensions() {
if (!isActive()) {
return Collections.emptyList();
}
return Arrays.asList("properties");
}

@Override
public PropertiesConfiguration getConfiguration(
final LoggerContext loggerContext, final ConfigurationSource source) {
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.21.0")
package org.apache.logging.log4j.core.config.properties;

import org.osgi.annotation.bundle.Export;
Expand Down
Loading
Loading