You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@logging.apache.org by "Christophe BRETHES (JIRA)" <ji...@apache.org> on 2019/02/18 15:25:00 UTC

[jira] [Created] (LOG4J2-2550) System properties log4j.plugin.packages is ignored

Christophe BRETHES created LOG4J2-2550:
------------------------------------------

             Summary: System properties log4j.plugin.packages is ignored
                 Key: LOG4J2-2550
                 URL: https://issues.apache.org/jira/browse/LOG4J2-2550
             Project: Log4j 2
          Issue Type: Bug
          Components: Core
    Affects Versions: 2.11.1
            Reporter: Christophe BRETHES
         Attachments: patch.txt

I want to define my own ConfigurationFactory (com.test.MyXmlConfigurationFactory) and make it loaded by log4j using the Plugin mechanism as described in [https://logging.apache.org/log4j/2.x/manual/extending.html#ConfigurationFactory]:
{code:java}
@Plugin(name = "OdigoXMLConfigurationFactory", category = ConfigurationFactory.CATEGORY )
@Order(1000)
public class MyXMLConfigurationFactory extends ConfigurationFactory {
...
}
{code}
According to [https://logging.apache.org/log4j/log4j-2.1/manual/plugins.html#Introduction] I try to launch my test project with -Dlog4j.plugin.packages=com.test but log4j doesnt see my ConfigurationFactory

Note : packages attribute of configuration node in log4j2.xml can't be used because factory is yet instanciated to read this file...

I saw that there is no code to handle this property, so I wrote it down (the patch is quite simple) and is also attached to this ticket :
{code:java}
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.LinkedHashMap;
@@ -35,11 +36,14 @@
 
     private static final CopyOnWriteArrayList<String> 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<String> PROPERTY_PACKAGES = new CopyOnWriteArrayList<>();
     private static final Logger LOGGER = StatusLogger.getLogger();
 
     private Map<String, PluginType<?>> 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<String, List<PluginType<?>>> 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));

{code}
Workaround : use -Dlog4j.configurationFactory=com.test.MyXmlConfigurationFactory if there is only one factory to load.



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)