--- /mnt/c/cbrethes/dev/sandbox/PluginManager.java 2018-11-25 21:59:38.000000000 +0100 +++ /mnt/c/cbrethes/dev/sandbox/apache-log4j-2.11.2-src/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/PluginManager.java 2019-02-18 16:07:53.932305500 +0100 @@ -21,6 +21,7 @@ import org.apache.logging.log4j.status.StatusLogger; import org.apache.logging.log4j.util.Strings; +import java.util.Arrays; import java.util.Collection; import java.util.HashMap; import java.util.LinkedHashMap; @@ -35,11 +36,14 @@ private static final CopyOnWriteArrayList PACKAGES = new CopyOnWriteArrayList<>(); private static final String LOG4J_PACKAGES = "org.apache.logging.log4j.core"; - + private static final String LOG4J_PLUGIN_PACKAGES_PROPERTY="log4j.plugin.packages" ; + private static final CopyOnWriteArrayList PROPERTY_PACKAGES = new CopyOnWriteArrayList<>(); private static final Logger LOGGER = StatusLogger.getLogger(); private Map> plugins = new HashMap<>(); private final String category; + //just a boolean to know if system property if log4j.plugin.packages has been processed + private static Boolean pluginSystemPropertiesHandled = false ; /** * Constructs a PluginManager for the plugin category name given. @@ -141,7 +145,28 @@ for (final Map>> pluginsByCategory : PluginRegistry.getInstance().getPluginsByCategoryByBundleId().values()) { mergeByName(newPlugins, pluginsByCategory.get(categoryLowerCase)); } - + // load packages defined by system property log4j.plugin.packages + if( ! pluginSystemPropertiesHandled ) { + synchronized (pluginSystemPropertiesHandled) { + //clear in case of synchronization issue has we synchronized inside if to avoid too many synchronization + PROPERTY_PACKAGES.clear(); + final String pluginPackagesStr = System.getProperty(LOG4J_PLUGIN_PACKAGES_PROPERTY); + if (pluginPackagesStr != null && pluginPackagesStr.trim().length()>1) { + if(pluginPackagesStr.indexOf(',')>0) { + PluginManager.PROPERTY_PACKAGES.addAll(Arrays.asList(pluginPackagesStr.split(","))); + } + else { + PluginManager.PROPERTY_PACKAGES.add(pluginPackagesStr); + } + } + pluginSystemPropertiesHandled = Boolean.TRUE ; + } + } + // Next, iterate any package defined by system property log4j.plugin.packages + for (final String pkg : PROPERTY_PACKAGES) { + mergeByName(newPlugins, PluginRegistry.getInstance().loadFromPackage(pkg).get(categoryLowerCase)); + } + // Next iterate any packages passed to the static addPackage method. for (final String pkg : PACKAGES) { mergeByName(newPlugins, PluginRegistry.getInstance().loadFromPackage(pkg).get(categoryLowerCase));