This is an automated email from the ASF dual-hosted git repository.

rgoers pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git


The following commit(s) were added to refs/heads/master by this push:
     new fced30a  LOG4J2-2486 - Require log4j2.Script.enableLanguages to be 
specified to enable scripting for specific languages
fced30a is described below

commit fced30a041e860bfffea7e53b2ee9eed50628155
Author: Ralph Goers <[email protected]>
AuthorDate: Tue Feb 8 00:54:37 2022 -0700

    LOG4J2-2486 - Require log4j2.Script.enableLanguages to be specified to 
enable scripting for specific languages
---
 .../org/apache/logging/log4j/util/Strings.java     | 10 +++
 .../log4j/cassandra/CassandraAppenderIT.java       |  1 +
 .../log4j/core/appender/routing/Routes.java        | 13 +++-
 .../core/appender/routing/RoutingAppender.java     | 12 ++++
 .../logging/log4j/core/script/ScriptManager.java   | 11 ++-
 log4j-script/pom.xml                               | 10 +++
 .../logging/log4j/script/ScriptManagerImpl.java    | 80 +++++++++++++++-------
 .../script/appender/ScriptAppenderSelector.java    |  5 +-
 .../appender/rolling/action/ScriptCondition.java   | 11 ++-
 .../log4j/script/config/arbiter/ScriptArbiter.java | 11 ++-
 .../script/factory/ScriptManagerFactoryImpl.java   | 21 +++++-
 .../logging/log4j/script/filter/ScriptFilter.java  | 12 +++-
 .../log4j/script/layout/ScriptPatternSelector.java | 11 ++-
 .../appender/ScriptAppenderSelectorTest.java       |  3 +
 .../RollingAppenderDeleteScriptFri13thTest.java    |  7 ++
 .../rolling/RollingAppenderDeleteScriptTest.java   |  7 ++
 .../rolling/action/ScriptConditionTest.java        | 20 +++---
 .../routing/DefaultRouteScriptAppenderTest.java    |  7 ++
 .../appender/routing/RoutesScriptAppenderTest.java |  7 ++
 .../log4j/script/config/TestConfigurator.java      |  3 +
 .../script/config/arbiter/ScriptArbiterTest.java   |  4 +-
 .../filter/ScriptFileFilterPropertiesTest.java     |  3 +
 .../log4j/script/filter/ScriptFileFilterTest.java  |  3 +
 .../log4j/script/filter/ScriptFilterTest.java      |  3 +
 .../log4j/script/filter/ScriptRefFilterTest.java   |  3 +
 .../log4j/script/layout/PatternSelectorTest.java   | 15 ++--
 pom.xml                                            | 22 ++++++
 src/changes/changes.xml                            |  3 +
 src/site/asciidoc/manual/configuration.adoc        | 10 +++
 29 files changed, 266 insertions(+), 62 deletions(-)

diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/util/Strings.java 
b/log4j-api/src/main/java/org/apache/logging/log4j/util/Strings.java
index 736ef32..286d86d 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/util/Strings.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/util/Strings.java
@@ -34,6 +34,7 @@ public final class Strings {
      * The empty string.
      */
     public static final String EMPTY = "";
+    private static final String COMMA_DELIMITED_RE = "\\s*,\\s*";
 
     /**
      * The empty string array.
@@ -303,6 +304,15 @@ public final class Strings {
     }
 
     /**
+     * Splits a comma separated list ignoring whitespace surrounding the list 
item.
+     * @param string The string to split.
+     * @return An array of strings.
+     */
+    public static String[] splitList(String string) {
+        return string.split(COMMA_DELIMITED_RE);
+    }
+
+    /**
      * Concatenates 2 Strings without allocation.
      * @param str1 the first string.
      * @param str2 the second string.
diff --git 
a/log4j-cassandra/src/test/java/org/apache/logging/log4j/cassandra/CassandraAppenderIT.java
 
b/log4j-cassandra/src/test/java/org/apache/logging/log4j/cassandra/CassandraAppenderIT.java
index 075253b..4392441 100644
--- 
a/log4j-cassandra/src/test/java/org/apache/logging/log4j/cassandra/CassandraAppenderIT.java
+++ 
b/log4j-cassandra/src/test/java/org/apache/logging/log4j/cassandra/CassandraAppenderIT.java
@@ -54,6 +54,7 @@ public class CassandraAppenderIT {
         "ndc list<text>" +
         ")";
 
+    @Disabled("Doesn't work in Java 11 at this Cassandra version")
     @Test
     @CassandraFixture(keyspace = "test", setup = DDL)
     @LoggerContextSource("CassandraAppenderTest.xml")
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/routing/Routes.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/routing/Routes.java
index 7355e2a..7678e3a 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/routing/Routes.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/routing/Routes.java
@@ -72,7 +72,18 @@ public final class Routes {
                 if (configuration == null) {
                     LOGGER.error("No Configuration defined for Routes; 
required for Script");
                 } else {
-                    configuration.getScriptManager().addScript(patternScript);
+                    ScriptManager scriptManager = 
configuration.getScriptManager();
+                    if (scriptManager == null) {
+                        LOGGER.error("Script support is not enabled");
+                        return null;
+                    }
+                    if (!scriptManager.addScript(patternScript)) {
+                        if (!scriptManager.isScriptRef(patternScript)) {
+                            if (!scriptManager.addScript(patternScript)) {
+                                return null;
+                            }
+                        }
+                    }
                 }
             }
             return new Routes(configuration, patternScript, pattern, routes);
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/routing/RoutingAppender.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/routing/RoutingAppender.java
index 584eadd..5d6eaed 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/routing/RoutingAppender.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/routing/RoutingAppender.java
@@ -84,6 +84,18 @@ public final class RoutingAppender extends AbstractAppender {
                 LOGGER.error("No routes defined for RoutingAppender {}", name);
                 return null;
             }
+            if (defaultRouteScript != null) {
+                ScriptManager scriptManager = 
getConfiguration().getScriptManager();
+                if (scriptManager == null) {
+                    LOGGER.error("Script support is not enabled");
+                    return null;
+                }
+                if (!scriptManager.isScriptRef(defaultRouteScript)) {
+                    if (!scriptManager.addScript(defaultRouteScript)) {
+                        return null;
+                    }
+                }
+            }
             return new RoutingAppender(name, getFilter(), 
isIgnoreExceptions(), routes, rewritePolicy,
                     getConfiguration(), purgePolicy, defaultRouteScript, 
getPropertyArray(), requiresLocation);
         }
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/script/ScriptManager.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/script/ScriptManager.java
index 297426a..0d79454 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/script/ScriptManager.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/script/ScriptManager.java
@@ -16,10 +16,12 @@
  */
 package org.apache.logging.log4j.core.script;
 
+import java.util.Set;
+
 import org.apache.logging.log4j.plugins.Node;
 
 /**
- * Class Description goes here.
+ * Script Manager.
  */
 public interface ScriptManager {
 
@@ -28,7 +30,12 @@ public interface ScriptManager {
      * @param child The Scripts node.
      */
     void addScripts(Node child);
-    void addScript(final Script script);
+
+    boolean addScript(final Script script);
+
+    boolean isScriptRef(final Script script);
+
+    Set<String> getAllowedLanguages();
 
     ScriptBindings createBindings(final Script script);
 
diff --git a/log4j-script/pom.xml b/log4j-script/pom.xml
index de51e43..15908ae 100644
--- a/log4j-script/pom.xml
+++ b/log4j-script/pom.xml
@@ -60,6 +60,16 @@
       <scope>test</scope>
     </dependency>
     <dependency>
+      <groupId>org.junit.platform</groupId>
+      <artifactId>junit-platform-commons</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.junit-pioneer</groupId>
+      <artifactId>junit-pioneer</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
       <groupId>junit</groupId>
       <artifactId>junit</artifactId>
       <scope>test</scope>
diff --git 
a/log4j-script/src/main/java/org/apache/logging/log4j/script/ScriptManagerImpl.java
 
b/log4j-script/src/main/java/org/apache/logging/log4j/script/ScriptManagerImpl.java
index 46a7b2d..53ef675 100644
--- 
a/log4j-script/src/main/java/org/apache/logging/log4j/script/ScriptManagerImpl.java
+++ 
b/log4j-script/src/main/java/org/apache/logging/log4j/script/ScriptManagerImpl.java
@@ -17,14 +17,17 @@
 package org.apache.logging.log4j.script;
 
 import java.io.File;
-import java.io.Serializable;
 import java.nio.file.Path;
 import java.security.AccessController;
 import java.security.PrivilegedAction;
+import java.util.Arrays;
 import java.util.List;
+import java.util.Locale;
 import java.util.Objects;
+import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
+import java.util.stream.Collectors;
 
 import javax.script.Bindings;
 import javax.script.Compilable;
@@ -43,13 +46,15 @@ import org.apache.logging.log4j.core.script.ScriptManager;
 import org.apache.logging.log4j.core.util.FileWatcher;
 import org.apache.logging.log4j.core.util.WatchManager;
 import org.apache.logging.log4j.plugins.Node;
+import org.apache.logging.log4j.script.factory.ScriptManagerFactoryImpl;
 import org.apache.logging.log4j.status.StatusLogger;
+import org.apache.logging.log4j.util.PropertiesUtil;
 import org.apache.logging.log4j.util.Strings;
 
 /**
  * Manages the scripts use by the Configuration.
  */
-public class ScriptManagerImpl implements ScriptManager, FileWatcher, 
Serializable {
+public class ScriptManagerImpl implements ScriptManager, FileWatcher {
 
     private abstract class AbstractScriptRunner implements ScriptRunner {
 
@@ -69,7 +74,6 @@ public class ScriptManagerImpl implements ScriptManager, 
FileWatcher, Serializab
     private static class ScriptBindingsImpl extends SimpleBindings implements 
ScriptBindings {
     }
 
-    private static final long serialVersionUID = -2534169384971965196L;
     private static final String KEY_THREADING = "THREADING";
     private static final Logger logger = StatusLogger.getLogger();
 
@@ -77,12 +81,17 @@ public class ScriptManagerImpl implements ScriptManager, 
FileWatcher, Serializab
     private final ScriptEngineManager manager = new ScriptEngineManager();
     private final ConcurrentMap<String, ScriptRunner> scriptRunners = new 
ConcurrentHashMap<>();
     private final String languages;
+    private final Set<String> allowedLanguages;
     private final WatchManager watchManager;
 
     public ScriptManagerImpl(final Configuration configuration, final 
WatchManager watchManager) {
+        String scriptLanguages =
+                
PropertiesUtil.getProperties().getStringProperty(ScriptManagerFactoryImpl.SCRIPT_LANGUAGES);
         this.configuration = configuration;
         this.watchManager = watchManager;
         final List<ScriptEngineFactory> factories = 
manager.getEngineFactories();
+        allowedLanguages = 
Arrays.stream(Strings.splitList(scriptLanguages)).map(String::toLowerCase)
+                .collect(Collectors.toSet());
         if (logger.isDebugEnabled()) {
             final StringBuilder sb = new StringBuilder();
             final int factorySize = factories.size();
@@ -95,10 +104,12 @@ public class ScriptManagerImpl implements ScriptManager, 
FileWatcher, Serializab
                 final StringBuilder names = new StringBuilder();
                 final List<String> languageNames = factory.getNames();
                 for (final String name : languageNames) {
-                    if (names.length() > 0) {
-                        names.append(", ");
+                    if 
(allowedLanguages.contains(name.toLowerCase(Locale.ROOT))) {
+                        if (names.length() > 0) {
+                            names.append(", ");
+                        }
+                        names.append(name);
                     }
-                    names.append(name);
                 }
                 boolean compiled = false;
                 try {
@@ -120,16 +131,26 @@ public class ScriptManagerImpl implements ScriptManager, 
FileWatcher, Serializab
             final StringBuilder names = new StringBuilder();
             for (final ScriptEngineFactory factory : factories) {
                 for (final String name : factory.getNames()) {
-                    if (names.length() > 0) {
-                        names.append(", ");
+                    if 
(allowedLanguages.contains(name.toLowerCase(Locale.ROOT))) {
+                        if (names.length() > 0) {
+                            names.append(", ");
+                        }
+                        names.append(name);
                     }
-                    names.append(name);
                 }
             }
             languages = names.toString();
         }
     }
 
+    public boolean isScriptRef(final Script script) {
+        return script instanceof ScriptRef;
+    }
+
+    public Set<String> getAllowedLanguages() {
+        return allowedLanguages;
+    }
+
     public void addScripts(Node child) {
         for (final AbstractScript script : 
child.getObject(AbstractScript[].class)) {
             if (script instanceof ScriptRef) {
@@ -141,26 +162,33 @@ public class ScriptManagerImpl implements ScriptManager, 
FileWatcher, Serializab
         }
     }
 
-    public void addScript(final Script script) {
-        final ScriptEngine engine = 
manager.getEngineByName(script.getLanguage());
-        if (engine == null) {
-            logger.error("No ScriptEngine found for language " + 
script.getLanguage() + ". Available languages are: "
-                    + languages);
-            return;
-        }
-        if (engine.getFactory().getParameter(KEY_THREADING) == null) {
-            scriptRunners.put(script.getName(), new 
ThreadLocalScriptRunner(script));
-        } else {
-            scriptRunners.put(script.getName(), new MainScriptRunner(engine, 
script));
-        }
+    public boolean addScript(final Script script) {
+        if 
(allowedLanguages.contains(script.getLanguage().toLowerCase(Locale.ROOT))) {
+            final ScriptEngine engine = 
manager.getEngineByName(script.getLanguage());
+            if (engine == null) {
+                logger.error("No ScriptEngine found for language " + 
script.getLanguage() + ". Available languages are: "
+                        + languages);
+                return false;
+            }
+            if (engine.getFactory().getParameter(KEY_THREADING) == null) {
+                scriptRunners.put(script.getName(), new 
ThreadLocalScriptRunner(script));
+            } else {
+                scriptRunners.put(script.getName(), new 
MainScriptRunner(engine, script));
+            }
 
-        if (script instanceof ScriptFile) {
-            final ScriptFile scriptFile = (ScriptFile) script;
-            final Path path = scriptFile.getPath();
-            if (scriptFile.isWatched() && path != null) {
-                watchManager.watchFile(path.toFile(), this);
+            if (script instanceof ScriptFile) {
+                final ScriptFile scriptFile = (ScriptFile) script;
+                final Path path = scriptFile.getPath();
+                if (scriptFile.isWatched() && path != null) {
+                    watchManager.watchFile(path.toFile(), this);
+                }
             }
+        } else {
+            logger.error("Unable to add script {}, {} has not been configured 
as an allowed language",
+                    script.getName(), script.getLanguage());
+            return false;
         }
+        return true;
     }
 
     public static ScriptBindings createBindings() {
diff --git 
a/log4j-script/src/main/java/org/apache/logging/log4j/script/appender/ScriptAppenderSelector.java
 
b/log4j-script/src/main/java/org/apache/logging/log4j/script/appender/ScriptAppenderSelector.java
index 0ea9fb2..c4c2d6c 100644
--- 
a/log4j-script/src/main/java/org/apache/logging/log4j/script/appender/ScriptAppenderSelector.java
+++ 
b/log4j-script/src/main/java/org/apache/logging/log4j/script/appender/ScriptAppenderSelector.java
@@ -83,9 +83,12 @@ public class ScriptAppenderSelector extends AbstractAppender 
{
             }
             final ScriptManager scriptManager = 
configuration.getScriptManager();
             if (scriptManager == null) {
+                LOGGER.error("Script support is not enabled");
+                return null;
+            }
+            if (!scriptManager.addScript(script)) {
                 return null;
             }
-            scriptManager.addScript(script);
             final ScriptBindings bindings = 
scriptManager.createBindings(script);
             AbstractLifeCycle.LOGGER.debug("ScriptAppenderSelector '{}' 
executing {} '{}': {}", name, script.getLanguage(),
                     script.getName(), script.getScriptText());
diff --git 
a/log4j-script/src/main/java/org/apache/logging/log4j/script/appender/rolling/action/ScriptCondition.java
 
b/log4j-script/src/main/java/org/apache/logging/log4j/script/appender/rolling/action/ScriptCondition.java
index 744d5bb..8fa9175 100644
--- 
a/log4j-script/src/main/java/org/apache/logging/log4j/script/appender/rolling/action/ScriptCondition.java
+++ 
b/log4j-script/src/main/java/org/apache/logging/log4j/script/appender/rolling/action/ScriptCondition.java
@@ -60,9 +60,6 @@ public class ScriptCondition implements ScriptConditional {
     public ScriptCondition(final Script script, final Configuration 
configuration) {
         this.script = Objects.requireNonNull(script, "script");
         this.configuration = Objects.requireNonNull(configuration, 
"configuration");
-        if (!(script instanceof ScriptRef)) {
-            configuration.getScriptManager().addScript(script);
-        }
     }
 
     /**
@@ -112,11 +109,19 @@ public class ScriptCondition implements ScriptConditional 
{
             LOGGER.error("A Script, ScriptFile or ScriptRef element must be 
provided for this ScriptCondition");
             return null;
         }
+        if (configuration.getScriptManager() == null) {
+            LOGGER.error("Script support is not enabled");
+            return null;
+        }
         if (script instanceof ScriptRef) {
             if (configuration.getScriptManager().getScript(script.getName()) 
== null) {
                 LOGGER.error("ScriptCondition: No script with name {} has been 
declared.", script.getName());
                 return null;
             }
+        } else {
+            if (!configuration.getScriptManager().addScript(script)) {
+                return null;
+            }
         }
         return new ScriptCondition(script, configuration);
     }
diff --git 
a/log4j-script/src/main/java/org/apache/logging/log4j/script/config/arbiter/ScriptArbiter.java
 
b/log4j-script/src/main/java/org/apache/logging/log4j/script/config/arbiter/ScriptArbiter.java
index 35d06ec..b8163c4 100644
--- 
a/log4j-script/src/main/java/org/apache/logging/log4j/script/config/arbiter/ScriptArbiter.java
+++ 
b/log4j-script/src/main/java/org/apache/logging/log4j/script/config/arbiter/ScriptArbiter.java
@@ -45,9 +45,6 @@ public class ScriptArbiter implements Arbiter {
     private ScriptArbiter(final Configuration configuration, final Script 
script) {
         this.configuration = configuration;
         this.script = script;
-        if (!(script instanceof ScriptRef)) {
-            configuration.getScriptManager().addScript(script);
-        }
     }
 
     /**
@@ -110,11 +107,19 @@ public class ScriptArbiter implements Arbiter {
                 LOGGER.error("A Script, ScriptFile or ScriptRef element must 
be provided for this ScriptFilter");
                 return null;
             }
+            if (configuration.getScriptManager() == null) {
+                LOGGER.error("Script support is not enabled");
+                return null;
+            }
             if (script instanceof ScriptRef) {
                 if 
(configuration.getScriptManager().getScript(script.getName()) == null) {
                     LOGGER.error("No script with name {} has been declared.", 
script.getName());
                     return null;
                 }
+            } else {
+                if (!configuration.getScriptManager().addScript(script)) {
+                    return null;
+                }
             }
             return new ScriptArbiter(configuration, script);
         }
diff --git 
a/log4j-script/src/main/java/org/apache/logging/log4j/script/factory/ScriptManagerFactoryImpl.java
 
b/log4j-script/src/main/java/org/apache/logging/log4j/script/factory/ScriptManagerFactoryImpl.java
index 18887d5..d2272e8 100644
--- 
a/log4j-script/src/main/java/org/apache/logging/log4j/script/factory/ScriptManagerFactoryImpl.java
+++ 
b/log4j-script/src/main/java/org/apache/logging/log4j/script/factory/ScriptManagerFactoryImpl.java
@@ -16,19 +16,38 @@
  */
 package org.apache.logging.log4j.script.factory;
 
+import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.core.config.Configuration;
 import org.apache.logging.log4j.core.script.ScriptManager;
 import org.apache.logging.log4j.core.script.ScriptManagerFactory;
+import org.apache.logging.log4j.core.util.Constants;
 import org.apache.logging.log4j.core.util.WatchManager;
 import org.apache.logging.log4j.script.ScriptManagerImpl;
+import org.apache.logging.log4j.status.StatusLogger;
+import org.apache.logging.log4j.util.PropertiesUtil;
 
 /**
  * Creates a ScriptManager.
  */
 public class ScriptManagerFactoryImpl implements ScriptManagerFactory {
+    private static final Logger LOGGER = StatusLogger.getLogger();
+
+    /**
+     * Control which script languages are allowed, if any.
+     */
+    public static final String SCRIPT_LANGUAGES = 
"log4j2.Script.enableLanguages";
 
     @Override
     public ScriptManager createScriptManager(Configuration configuration, 
WatchManager watchManager) {
-        return new ScriptManagerImpl(configuration, watchManager);
+        String scriptLanguages = 
PropertiesUtil.getProperties().getStringProperty(SCRIPT_LANGUAGES);
+        if (scriptLanguages != null) {
+            try {
+                return new ScriptManagerImpl(configuration, watchManager);
+            } catch (final LinkageError | Exception e) {
+                // LOG4J2-1920 ScriptEngineManager is not available in Android
+                LOGGER.info("Cannot initialize scripting support because this 
JRE does not support it.", e);
+            }
+        }
+        return null;
     }
 }
diff --git 
a/log4j-script/src/main/java/org/apache/logging/log4j/script/filter/ScriptFilter.java
 
b/log4j-script/src/main/java/org/apache/logging/log4j/script/filter/ScriptFilter.java
index 8e793a6..4932f4e 100644
--- 
a/log4j-script/src/main/java/org/apache/logging/log4j/script/filter/ScriptFilter.java
+++ 
b/log4j-script/src/main/java/org/apache/logging/log4j/script/filter/ScriptFilter.java
@@ -55,9 +55,6 @@ public final class ScriptFilter extends AbstractFilter {
         super(onMatch, onMismatch);
         this.script = script;
         this.configuration = configuration;
-        if (!(script instanceof ScriptRef)) {
-            configuration.getScriptManager().addScript(script);
-        }
     }
 
     @Override
@@ -144,13 +141,22 @@ public final class ScriptFilter extends AbstractFilter {
             AbstractLifeCycle.LOGGER.error("A Script, ScriptFile or ScriptRef 
element must be provided for this ScriptFilter");
             return null;
         }
+        if (configuration.getScriptManager() == null) {
+            LOGGER.error("Script support is not enabled");
+            return null;
+        }
         if (script instanceof ScriptRef) {
             if (configuration.getScriptManager().getScript(script.getName()) 
== null) {
                 logger.error("No script with name {} has been declared.", 
script.getName());
                 return null;
             }
+        } else {
+            if (!configuration.getScriptManager().addScript(script)) {
+                return null;
+            }
         }
 
+
         return new ScriptFilter(script, configuration, onMatch, onMismatch);
     }
 
diff --git 
a/log4j-script/src/main/java/org/apache/logging/log4j/script/layout/ScriptPatternSelector.java
 
b/log4j-script/src/main/java/org/apache/logging/log4j/script/layout/ScriptPatternSelector.java
index 0828756..4c058f4 100644
--- 
a/log4j-script/src/main/java/org/apache/logging/log4j/script/layout/ScriptPatternSelector.java
+++ 
b/log4j-script/src/main/java/org/apache/logging/log4j/script/layout/ScriptPatternSelector.java
@@ -85,11 +85,19 @@ public class ScriptPatternSelector implements 
PatternSelector {
                 LOGGER.error("A Script, ScriptFile or ScriptRef element must 
be provided for this ScriptFilter");
                 return null;
             }
+            if (configuration.getScriptManager() == null) {
+                LOGGER.error("Script support is not enabled");
+                return null;
+            }
             if (script instanceof ScriptRef) {
                 if 
(configuration.getScriptManager().getScript(script.getName()) == null) {
                     LOGGER.error("No script with name {} has been declared.", 
script.getName());
                     return null;
                 }
+            } else {
+                if (!configuration.getScriptManager().addScript(script)) {
+                    return null;
+                }
             }
             if (defaultPattern == null) {
                 defaultPattern = PatternLayout.DEFAULT_CONVERSION_PATTERN;
@@ -156,9 +164,6 @@ public class ScriptPatternSelector implements 
PatternSelector {
                                  final boolean noConsoleNoAnsi, final 
Configuration config) {
         this.script = script;
         this.configuration = config;
-        if (!(script instanceof ScriptRef)) {
-            config.getScriptManager().addScript(script);
-        }
         final PatternParser parser = PatternLayout.createPatternParser(config);
         boolean needsLocation = false;
         for (final PatternMatch property : properties) {
diff --git 
a/log4j-script/src/test/java/org/apache/logging/log4j/script/appender/ScriptAppenderSelectorTest.java
 
b/log4j-script/src/test/java/org/apache/logging/log4j/script/appender/ScriptAppenderSelectorTest.java
index 4d70fc4..809c86c 100644
--- 
a/log4j-script/src/test/java/org/apache/logging/log4j/script/appender/ScriptAppenderSelectorTest.java
+++ 
b/log4j-script/src/test/java/org/apache/logging/log4j/script/appender/ScriptAppenderSelectorTest.java
@@ -19,17 +19,20 @@ package org.apache.logging.log4j.script.appender;
 import org.apache.logging.log4j.MarkerManager;
 import org.apache.logging.log4j.core.config.Configuration;
 import org.apache.logging.log4j.core.test.junit.LoggerContextSource;
+import org.apache.logging.log4j.script.factory.ScriptManagerFactoryImpl;
 import org.apache.logging.log4j.spi.ExtendedLogger;
 import org.apache.logging.log4j.core.test.appender.ListAppender;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.condition.DisabledForJreRange;
 import org.junit.jupiter.api.condition.JRE;
+import org.junitpioneer.jupiter.SetSystemProperty;
 
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.hasSize;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertNull;
 
+@SetSystemProperty(key = ScriptManagerFactoryImpl.SCRIPT_LANGUAGES, value = 
"Groovy, Javascript")
 public class ScriptAppenderSelectorTest {
 
     @Test
diff --git 
a/log4j-script/src/test/java/org/apache/logging/log4j/script/appender/rolling/RollingAppenderDeleteScriptFri13thTest.java
 
b/log4j-script/src/test/java/org/apache/logging/log4j/script/appender/rolling/RollingAppenderDeleteScriptFri13thTest.java
index 156a8d3..96a5e3f 100644
--- 
a/log4j-script/src/test/java/org/apache/logging/log4j/script/appender/rolling/RollingAppenderDeleteScriptFri13thTest.java
+++ 
b/log4j-script/src/test/java/org/apache/logging/log4j/script/appender/rolling/RollingAppenderDeleteScriptFri13thTest.java
@@ -24,6 +24,8 @@ import java.io.File;
 
 import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.core.test.junit.LoggerContextRule;
+import org.apache.logging.log4j.script.factory.ScriptManagerFactoryImpl;
+import org.junit.BeforeClass;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.RuleChain;
@@ -38,6 +40,11 @@ public class RollingAppenderDeleteScriptFri13thTest {
 
     private final LoggerContextRule loggerContextRule = 
LoggerContextRule.createShutdownTimeoutLoggerContextRule(CONFIG);
 
+    @BeforeClass
+    public static void beforeClass() {
+        System.setProperty(ScriptManagerFactoryImpl.SCRIPT_LANGUAGES, "Groovy, 
Javascript");
+    }
+
     @Rule
     public RuleChain chain = loggerContextRule.withCleanFoldersRule(DIR);
 
diff --git 
a/log4j-script/src/test/java/org/apache/logging/log4j/script/appender/rolling/RollingAppenderDeleteScriptTest.java
 
b/log4j-script/src/test/java/org/apache/logging/log4j/script/appender/rolling/RollingAppenderDeleteScriptTest.java
index 3de0996..8206002 100644
--- 
a/log4j-script/src/test/java/org/apache/logging/log4j/script/appender/rolling/RollingAppenderDeleteScriptTest.java
+++ 
b/log4j-script/src/test/java/org/apache/logging/log4j/script/appender/rolling/RollingAppenderDeleteScriptTest.java
@@ -23,6 +23,8 @@ import java.io.File;
 
 import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.core.test.junit.LoggerContextRule;
+import org.apache.logging.log4j.script.factory.ScriptManagerFactoryImpl;
+import org.junit.BeforeClass;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.RuleChain;
@@ -37,6 +39,11 @@ public class RollingAppenderDeleteScriptTest {
 
     private final LoggerContextRule loggerContextRule = 
LoggerContextRule.createShutdownTimeoutLoggerContextRule(CONFIG);
 
+    @BeforeClass
+    public static void beforeClass() {
+        System.setProperty(ScriptManagerFactoryImpl.SCRIPT_LANGUAGES, "Groovy, 
Javascript");
+    }
+
     @Rule
     public RuleChain chain = loggerContextRule.withCleanFoldersRule(DIR);
 
diff --git 
a/log4j-script/src/test/java/org/apache/logging/log4j/script/appender/rolling/action/ScriptConditionTest.java
 
b/log4j-script/src/test/java/org/apache/logging/log4j/script/appender/rolling/action/ScriptConditionTest.java
index 5374db7..6de9f4b 100644
--- 
a/log4j-script/src/test/java/org/apache/logging/log4j/script/appender/rolling/action/ScriptConditionTest.java
+++ 
b/log4j-script/src/test/java/org/apache/logging/log4j/script/appender/rolling/action/ScriptConditionTest.java
@@ -22,10 +22,10 @@ import org.apache.logging.log4j.core.config.Configuration;
 import org.apache.logging.log4j.core.config.DefaultConfiguration;
 import 
org.apache.logging.log4j.core.test.appender.rolling.action.DummyFileAttributes;
 import org.apache.logging.log4j.script.ScriptPlugin;
+import org.apache.logging.log4j.script.factory.ScriptManagerFactoryImpl;
 import org.junit.jupiter.api.Tag;
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.condition.DisabledForJreRange;
-import org.junit.jupiter.api.condition.JRE;
+import org.junitpioneer.jupiter.SetSystemProperty;
 
 import java.nio.file.Path;
 import java.nio.file.Paths;
@@ -37,17 +37,18 @@ import static org.junit.jupiter.api.Assertions.*;
 /**
  * Tests the ScriptCondition class.
  */
+@SetSystemProperty(key = ScriptManagerFactoryImpl.SCRIPT_LANGUAGES, value = 
"js, javascript, groovy")
 public class ScriptConditionTest {
 
     @Test
     public void testConstructorDisallowsNullScript() {
-        assertThrows(NullPointerException.class, () -> new 
ScriptCondition(null, new DefaultConfiguration()));
+        assertNull(ScriptCondition.createCondition(null, new 
DefaultConfiguration()));
     }
 
     @Test
     public void testConstructorDisallowsNullConfig() {
-        assertThrows(NullPointerException.class,
-                () -> new ScriptCondition(new ScriptPlugin("test", "js", 
"print('hi')"), null));
+        assertThrows(NullPointerException.class, () -> 
ScriptCondition.createCondition(new ScriptPlugin("test",
+                "js", "print('hi')"), null));
     }
 
     @Test
@@ -62,13 +63,12 @@ public class ScriptConditionTest {
     }
 
     @Test
-    @DisabledForJreRange(min = JRE.JAVA_15, disabledReason = "JEP 372: Remove 
the Nashorn JavaScript Engine")
     public void testSelectFilesToDelete() {
         final Configuration config = new DefaultConfiguration();
         config.initialize(); // creates the ScriptManager
 
         final ScriptPlugin script = new ScriptPlugin("test", "javascript", 
"pathList;"); // script that returns pathList
-        final ScriptCondition condition = new ScriptCondition(script, config);
+        final ScriptCondition condition = 
ScriptCondition.createCondition(script, config);
         final List<PathWithAttributes> pathList = new ArrayList<>();
         final Path base = Paths.get("baseDirectory");
         final List<PathWithAttributes> result = 
condition.selectFilesToDelete(base, pathList);
@@ -76,7 +76,6 @@ public class ScriptConditionTest {
     }
 
     @Test
-    @DisabledForJreRange(min = JRE.JAVA_15, disabledReason = "JEP 372: Remove 
the Nashorn JavaScript Engine")
     public void testSelectFilesToDelete2() {
         final Configuration config = new DefaultConfiguration();
         config.initialize(); // creates the ScriptManager
@@ -89,7 +88,7 @@ public class ScriptConditionTest {
         final String scriptText = "pathList.remove(1);" //
                 + "pathList;";
         final ScriptPlugin script = new ScriptPlugin("test", "javascript", 
scriptText);
-        final ScriptCondition condition = new ScriptCondition(script, config);
+        final ScriptCondition condition = 
ScriptCondition.createCondition(script, config);
         final Path base = Paths.get("baseDirectory");
         final List<PathWithAttributes> result = 
condition.selectFilesToDelete(base, pathList);
         assertSame(result, pathList);
@@ -100,7 +99,6 @@ public class ScriptConditionTest {
 
     @Test
     @Tag("groovy")
-    @DisabledForJreRange(min = JRE.JAVA_12, disabledReason = "Groovy 
ScriptEngine incompatibilities")
     public void testSelectFilesToDelete3() {
         final Configuration config = new DefaultConfiguration();
         config.initialize(); // creates the ScriptManager
@@ -131,7 +129,7 @@ public class ScriptConditionTest {
                 + "println copy;"
                 + "copy;";
         final ScriptPlugin script = new ScriptPlugin("test", "groovy", 
scriptText);
-        final ScriptCondition condition = new ScriptCondition(script, config);
+        final ScriptCondition condition = 
ScriptCondition.createCondition(script, config);
         final Path base = Paths.get("/path");
         final List<PathWithAttributes> result = 
condition.selectFilesToDelete(base, pathList);
         assertEquals(1, result.size());
diff --git 
a/log4j-script/src/test/java/org/apache/logging/log4j/script/appender/routing/DefaultRouteScriptAppenderTest.java
 
b/log4j-script/src/test/java/org/apache/logging/log4j/script/appender/routing/DefaultRouteScriptAppenderTest.java
index 01cd51f..8e2be73 100644
--- 
a/log4j-script/src/test/java/org/apache/logging/log4j/script/appender/routing/DefaultRouteScriptAppenderTest.java
+++ 
b/log4j-script/src/test/java/org/apache/logging/log4j/script/appender/routing/DefaultRouteScriptAppenderTest.java
@@ -26,7 +26,9 @@ import 
org.apache.logging.log4j.core.appender.routing.RoutingAppender;
 import org.apache.logging.log4j.core.config.AppenderControl;
 import org.apache.logging.log4j.core.test.junit.LoggerContextRule;
 import org.apache.logging.log4j.core.test.appender.ListAppender;
+import org.apache.logging.log4j.script.factory.ScriptManagerFactoryImpl;
 import org.junit.Assert;
+import org.junit.BeforeClass;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -53,6 +55,11 @@ public class DefaultRouteScriptAppenderTest {
         // @formatter:on
     }
 
+    @BeforeClass
+    public static void beforeClass() {
+        System.setProperty(ScriptManagerFactoryImpl.SCRIPT_LANGUAGES, "Groovy, 
Javascript");
+    }
+
     @Rule
     public final LoggerContextRule loggerContextRule;
 
diff --git 
a/log4j-script/src/test/java/org/apache/logging/log4j/script/appender/routing/RoutesScriptAppenderTest.java
 
b/log4j-script/src/test/java/org/apache/logging/log4j/script/appender/routing/RoutesScriptAppenderTest.java
index e7dd240..f07aa08 100644
--- 
a/log4j-script/src/test/java/org/apache/logging/log4j/script/appender/routing/RoutesScriptAppenderTest.java
+++ 
b/log4j-script/src/test/java/org/apache/logging/log4j/script/appender/routing/RoutesScriptAppenderTest.java
@@ -35,7 +35,9 @@ import org.apache.logging.log4j.core.config.AppenderControl;
 import org.apache.logging.log4j.core.impl.DefaultLogEventFactory;
 import org.apache.logging.log4j.core.test.junit.LoggerContextRule;
 import org.apache.logging.log4j.core.test.appender.ListAppender;
+import org.apache.logging.log4j.script.factory.ScriptManagerFactoryImpl;
 import org.junit.Assert;
+import org.junit.BeforeClass;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.experimental.categories.Category;
@@ -58,6 +60,11 @@ public class RoutesScriptAppenderTest {
         // @formatter:on
     }
 
+    @BeforeClass
+    public static void beforeClass() {
+        System.setProperty(ScriptManagerFactoryImpl.SCRIPT_LANGUAGES, "Groovy, 
Javascript");
+    }
+
     @Rule
     public final LoggerContextRule loggerContextRule;
 
diff --git 
a/log4j-script/src/test/java/org/apache/logging/log4j/script/config/TestConfigurator.java
 
b/log4j-script/src/test/java/org/apache/logging/log4j/script/config/TestConfigurator.java
index e0ed655..e7a47fc 100644
--- 
a/log4j-script/src/test/java/org/apache/logging/log4j/script/config/TestConfigurator.java
+++ 
b/log4j-script/src/test/java/org/apache/logging/log4j/script/config/TestConfigurator.java
@@ -26,7 +26,9 @@ import 
org.apache.logging.log4j.core.config.builder.api.AppenderComponentBuilder
 import org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilder;
 import 
org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilderFactory;
 import org.apache.logging.log4j.core.config.builder.impl.BuiltConfiguration;
+import org.apache.logging.log4j.script.factory.ScriptManagerFactoryImpl;
 import org.junit.jupiter.api.Test;
+import org.junitpioneer.jupiter.SetSystemProperty;
 
 import static org.apache.logging.log4j.core.test.hamcrest.MapMatchers.hasSize;
 import static org.hamcrest.MatcherAssert.assertThat;
@@ -37,6 +39,7 @@ import static org.junit.jupiter.api.Assertions.assertNotNull;
 /**
  * Test Configuration
  */
+@SetSystemProperty(key = ScriptManagerFactoryImpl.SCRIPT_LANGUAGES, value = 
"beanshell, Groovy, Javascript")
 public class TestConfigurator {
     @Test
     public void testBuilderWithScripts() throws Exception {
diff --git 
a/log4j-script/src/test/java/org/apache/logging/log4j/script/config/arbiter/ScriptArbiterTest.java
 
b/log4j-script/src/test/java/org/apache/logging/log4j/script/config/arbiter/ScriptArbiterTest.java
index b293dfa..6f145b0 100644
--- 
a/log4j-script/src/test/java/org/apache/logging/log4j/script/config/arbiter/ScriptArbiterTest.java
+++ 
b/log4j-script/src/test/java/org/apache/logging/log4j/script/config/arbiter/ScriptArbiterTest.java
@@ -21,10 +21,12 @@ import org.apache.logging.log4j.core.LoggerContext;
 import org.apache.logging.log4j.core.appender.ConsoleAppender;
 import org.apache.logging.log4j.core.config.Configurator;
 import org.apache.logging.log4j.core.test.appender.ListAppender;
+import org.apache.logging.log4j.script.factory.ScriptManagerFactoryImpl;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.condition.DisabledForJreRange;
 import org.junit.jupiter.api.condition.JRE;
+import org.junitpioneer.jupiter.SetSystemProperty;
 
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertTrue;
@@ -32,7 +34,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
 /**
  * Tests basic condition processing.
  */
-@DisabledForJreRange(min = JRE.JAVA_15, disabledReason = "JEP 372: Remove the 
Nashorn JavaScript Engine")
+@SetSystemProperty(key = ScriptManagerFactoryImpl.SCRIPT_LANGUAGES, value = 
"Groovy, Javascript")
 public class ScriptArbiterTest {
 
     static final String CONFIG = "log4j2-scriptArbiters.xml";
diff --git 
a/log4j-script/src/test/java/org/apache/logging/log4j/script/filter/ScriptFileFilterPropertiesTest.java
 
b/log4j-script/src/test/java/org/apache/logging/log4j/script/filter/ScriptFileFilterPropertiesTest.java
index 6bee68c..ef09354 100644
--- 
a/log4j-script/src/test/java/org/apache/logging/log4j/script/filter/ScriptFileFilterPropertiesTest.java
+++ 
b/log4j-script/src/test/java/org/apache/logging/log4j/script/filter/ScriptFileFilterPropertiesTest.java
@@ -17,7 +17,10 @@
 package org.apache.logging.log4j.script.filter;
 
 import org.apache.logging.log4j.core.test.junit.LoggerContextSource;
+import org.apache.logging.log4j.script.factory.ScriptManagerFactoryImpl;
+import org.junitpioneer.jupiter.SetSystemProperty;
 
+@SetSystemProperty(key = ScriptManagerFactoryImpl.SCRIPT_LANGUAGES, value = 
"Groovy, Javascript")
 @LoggerContextSource("log4j-scriptFile-filters.properties")
 public class ScriptFileFilterPropertiesTest extends AbstractScriptFilterTest {
 }
diff --git 
a/log4j-script/src/test/java/org/apache/logging/log4j/script/filter/ScriptFileFilterTest.java
 
b/log4j-script/src/test/java/org/apache/logging/log4j/script/filter/ScriptFileFilterTest.java
index 0e79b70..3785e2d 100644
--- 
a/log4j-script/src/test/java/org/apache/logging/log4j/script/filter/ScriptFileFilterTest.java
+++ 
b/log4j-script/src/test/java/org/apache/logging/log4j/script/filter/ScriptFileFilterTest.java
@@ -17,7 +17,10 @@
 package org.apache.logging.log4j.script.filter;
 
 import org.apache.logging.log4j.core.test.junit.LoggerContextSource;
+import org.apache.logging.log4j.script.factory.ScriptManagerFactoryImpl;
+import org.junitpioneer.jupiter.SetSystemProperty;
 
+@SetSystemProperty(key = ScriptManagerFactoryImpl.SCRIPT_LANGUAGES, value = 
"Groovy, Javascript")
 @LoggerContextSource("log4j-scriptFile-filters.xml")
 public class ScriptFileFilterTest extends AbstractScriptFilterTest {
 }
diff --git 
a/log4j-script/src/test/java/org/apache/logging/log4j/script/filter/ScriptFilterTest.java
 
b/log4j-script/src/test/java/org/apache/logging/log4j/script/filter/ScriptFilterTest.java
index 9beac81..4e9742f 100644
--- 
a/log4j-script/src/test/java/org/apache/logging/log4j/script/filter/ScriptFilterTest.java
+++ 
b/log4j-script/src/test/java/org/apache/logging/log4j/script/filter/ScriptFilterTest.java
@@ -17,7 +17,10 @@
 package org.apache.logging.log4j.script.filter;
 
 import org.apache.logging.log4j.core.test.junit.LoggerContextSource;
+import org.apache.logging.log4j.script.factory.ScriptManagerFactoryImpl;
+import org.junitpioneer.jupiter.SetSystemProperty;
 
+@SetSystemProperty(key = ScriptManagerFactoryImpl.SCRIPT_LANGUAGES, value = 
"Groovy, Javascript")
 @LoggerContextSource("log4j-script-filters.xml")
 public class ScriptFilterTest extends AbstractScriptFilterTest {
 }
diff --git 
a/log4j-script/src/test/java/org/apache/logging/log4j/script/filter/ScriptRefFilterTest.java
 
b/log4j-script/src/test/java/org/apache/logging/log4j/script/filter/ScriptRefFilterTest.java
index 0397858..23551b3 100644
--- 
a/log4j-script/src/test/java/org/apache/logging/log4j/script/filter/ScriptRefFilterTest.java
+++ 
b/log4j-script/src/test/java/org/apache/logging/log4j/script/filter/ScriptRefFilterTest.java
@@ -17,7 +17,10 @@
 package org.apache.logging.log4j.script.filter;
 
 import org.apache.logging.log4j.core.test.junit.LoggerContextSource;
+import org.apache.logging.log4j.script.factory.ScriptManagerFactoryImpl;
+import org.junitpioneer.jupiter.SetSystemProperty;
 
+@SetSystemProperty(key = ScriptManagerFactoryImpl.SCRIPT_LANGUAGES, value = 
"Groovy, Javascript")
 @LoggerContextSource("log4j-scriptRef-filters.xml")
 public class ScriptRefFilterTest extends AbstractScriptFilterTest {
 }
diff --git 
a/log4j-script/src/test/java/org/apache/logging/log4j/script/layout/PatternSelectorTest.java
 
b/log4j-script/src/test/java/org/apache/logging/log4j/script/layout/PatternSelectorTest.java
index c29779b..f641583 100644
--- 
a/log4j-script/src/test/java/org/apache/logging/log4j/script/layout/PatternSelectorTest.java
+++ 
b/log4j-script/src/test/java/org/apache/logging/log4j/script/layout/PatternSelectorTest.java
@@ -22,13 +22,16 @@ import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.core.test.junit.Named;
 import org.apache.logging.log4j.core.test.junit.LoggerContextSource;
 import org.apache.logging.log4j.core.test.appender.ListAppender;
+import org.apache.logging.log4j.script.factory.ScriptManagerFactoryImpl;
 import org.apache.logging.log4j.util.Strings;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.condition.DisabledForJreRange;
 import org.junit.jupiter.api.condition.JRE;
+import org.junitpioneer.jupiter.SetSystemProperty;
 
 import static org.junit.jupiter.api.Assertions.*;
 
+@SetSystemProperty(key = ScriptManagerFactoryImpl.SCRIPT_LANGUAGES, value = 
"bsh, Javascript")
 @LoggerContextSource("log4j-patternSelector.xml")
 public class PatternSelectorTest {
 
@@ -43,14 +46,13 @@ public class PatternSelectorTest {
         assertEquals(3, messages.size(),
                 "Incorrect number of messages. Expected 3, Actual " + 
messages.size() + ": " + messages);
         final String expect = String.format("[TRACE] TestMarkerPatternSelector 
====== "
-                + 
"o.a.l.l.s.l.PatternSelectorTest.testMarkerPatternSelector:38 Enter ======%n");
+                + 
"o.a.l.l.s.l.PatternSelectorTest.testMarkerPatternSelector:41 Enter ======%n");
         assertEquals(expect, messages.get(0));
         assertEquals("[INFO ] TestMarkerPatternSelector Hello World" + 
Strings.LINE_SEPARATOR, messages.get(1));
         app.clear();
     }
 
     @Test
-    @DisabledForJreRange(min = JRE.JAVA_15, disabledReason = "JEP 372: Remove 
the Nashorn JavaScript Engine")
     public void testScriptPatternSelector(@Named("List2") final ListAppender 
app) {
         final org.apache.logging.log4j.Logger logger = 
LogManager.getLogger("TestScriptPatternSelector");
         final org.apache.logging.log4j.Logger logger2 = 
LogManager.getLogger("NoLocation");
@@ -63,9 +65,9 @@ public class PatternSelectorTest {
         assertEquals(4, messages.size(),
                 "Incorrect number of messages. Expected 4, Actual " + 
messages.size() + ": " + messages);
         String expect = "[TRACE] TestScriptPatternSelector ====== " +
-                "o.a.l.l.s.l.PatternSelectorTest.testScriptPatternSelector:57 
Enter ======" + Strings.LINE_SEPARATOR;
+                "o.a.l.l.s.l.PatternSelectorTest.testScriptPatternSelector:59 
Enter ======" + Strings.LINE_SEPARATOR;
         assertEquals(expect, messages.get(0));
-        expect = "[INFO ] TestScriptPatternSelector 
o.a.l.l.s.l.PatternSelectorTest.testScriptPatternSelector.58 " +
+        expect = "[INFO ] TestScriptPatternSelector 
o.a.l.l.s.l.PatternSelectorTest.testScriptPatternSelector.60 " +
                 "Hello World" + Strings.LINE_SEPARATOR;
         assertEquals(expect, messages.get(1));
         assertEquals("[INFO ] NoLocation No location information" + 
Strings.LINE_SEPARATOR, messages.get(2));
@@ -73,7 +75,6 @@ public class PatternSelectorTest {
     }
 
     @Test
-    @DisabledForJreRange(min = JRE.JAVA_15, disabledReason = "JEP 372: Remove 
the Nashorn JavaScript Engine")
     public void testJavaScriptPatternSelector(@Named("List3") final 
ListAppender app) {
         final org.apache.logging.log4j.Logger logger = 
LogManager.getLogger("TestJavaScriptPatternSelector");
         final org.apache.logging.log4j.Logger logger2 = 
LogManager.getLogger("JavascriptNoLocation");
@@ -86,10 +87,10 @@ public class PatternSelectorTest {
         assertEquals(4, messages.size(),
                 "Incorrect number of messages. Expected 4, Actual " + 
messages.size() + ": " + messages);
         String expect = "[TRACE] TestJavaScriptPatternSelector ====== " +
-                
"o.a.l.l.s.l.PatternSelectorTest.testJavaScriptPatternSelector:80 Enter ======" 
+ Strings.LINE_SEPARATOR;
+                
"o.a.l.l.s.l.PatternSelectorTest.testJavaScriptPatternSelector:81 Enter ======" 
+ Strings.LINE_SEPARATOR;
         assertEquals(expect, messages.get(0));
         expect = "[INFO ] TestJavaScriptPatternSelector " +
-                
"o.a.l.l.s.l.PatternSelectorTest.testJavaScriptPatternSelector.81 Hello World" 
+ Strings.LINE_SEPARATOR;
+                
"o.a.l.l.s.l.PatternSelectorTest.testJavaScriptPatternSelector.82 Hello World" 
+ Strings.LINE_SEPARATOR;
         assertEquals(expect, messages.get(1));
         assertEquals("[INFO ] JavascriptNoLocation No location information" + 
Strings.LINE_SEPARATOR, messages.get(2));
         app.clear();
diff --git a/pom.xml b/pom.xml
index 059516f..3e8faa8 100644
--- a/pom.xml
+++ b/pom.xml
@@ -275,6 +275,7 @@
     <jctoolsVersion>3.3.0</jctoolsVersion>
     <junitVersion>4.13.2</junitVersion>
     <junitJupiterVersion>5.7.2</junitJupiterVersion>
+    <junitPioneerVersion>1.5.0</junitPioneerVersion>
     <mockitoVersion>4.2.0</mockitoVersion>
     <byteBuddyVersion>1.11.0</byteBuddyVersion>
     <argLine>-Xms256m -Xmx1024m</argLine>
@@ -731,15 +732,36 @@
       <!-- JUnit 5 engine -->
       <dependency>
         <groupId>org.junit.jupiter</groupId>
+        <artifactId>junit-jupiter-api</artifactId>
+        <version>${junitJupiterVersion}</version>
+      </dependency>
+      <dependency>
+        <groupId>org.junit.jupiter</groupId>
         <artifactId>junit-jupiter-engine</artifactId>
         <version>${junitJupiterVersion}</version>
       </dependency>
+      <dependency>
+        <groupId>org.junit.platform</groupId>
+        <artifactId>junit-platform-commons</artifactId>
+        <version>1.8.2</version>
+      </dependency>
+      <dependency>
+        <groupId>org.junit-pioneer</groupId>
+        <artifactId>junit-pioneer</artifactId>
+        <version>${junitPioneerVersion}</version>
+      </dependency>
       <!-- JUnit 4 to 5 migration support -->
       <dependency>
         <groupId>org.junit.jupiter</groupId>
         <artifactId>junit-jupiter-migrationsupport</artifactId>
         <version>${junitJupiterVersion}</version>
       </dependency>
+      <dependency>
+        <groupId>org.junit.platform</groupId>
+        <artifactId>junit-platform-commons</artifactId>
+        <version>1.8.2</version>
+        <scope>test</scope>
+      </dependency>
       <!-- JUnit 5 parameterized test support -->
       <dependency>
         <groupId>org.junit.jupiter</groupId>
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 209f264..3d4ad06 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -303,6 +303,9 @@
         Fix log4j-jakarta-web service file #723.
       </action>
       <!-- ADD -->
+      <action issue="LOG4J2-2486" dev="rgoers" type="add">
+        Require log4j2.Script.enableLanguages to be specified to enable 
scripting for specific languages.
+      </action>
       <action issue="LOG4J2-3303" dev="vy" type="add" due-to="ramananravi">
         Add TB support to FileSize.
       </action>
diff --git a/src/site/asciidoc/manual/configuration.adoc 
b/src/site/asciidoc/manual/configuration.adoc
index 609579d..6ba6702 100644
--- a/src/site/asciidoc/manual/configuration.adoc
+++ b/src/site/asciidoc/manual/configuration.adoc
@@ -1375,6 +1375,9 @@ Engine] web site. However, some of the languages listed 
there, such as
 JavaScript, Groovy and Beanshell, directly support the JSR 223 scripting
 framework and only require that the jars for that language be installed.
 
+As of Log4j 2.17.2 the languages to be supported must be specified as a comma 
separated list in the
+`log4j2.Script.enableLanguages` system property.
+
 The components that support using scripts do so by allowing a `<script>`,
 `<scriptFile>`, or `<scriptRef>` element to be configured on them. The
 script element contains a name for the script, the language of the
@@ -2590,4 +2593,11 @@ defining all message patterns using `%m{nolookups}`.
 |false
 |true or false if the host name should be verified
 
+|[[log4j2.Script.enableLanguages]]log4j2.Script.enableLanguages
+|LOG4J_SCRIPT_ENABLE_LANGUAGES
+|
+| The list of script languages that are allowed to execute. The names 
specified must have a ScriptEngine installed
+that advertises the same language(s) in order for scripting to be enabled. If 
no languages are specified, which is
+the default, the ScriptManager will not be installed.
+
 |===

Reply via email to