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

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


The following commit(s) were added to refs/heads/2.x by this push:
     new 14505330c1 Enforce explicit names for global scripts and refine script 
id handling (#3691)
14505330c1 is described below

commit 14505330c11d604e4af1b0b9319da38a0fd5409e
Author: jhl221123 <[email protected]>
AuthorDate: Fri Jun 20 17:57:46 2025 +0900

    Enforce explicit names for global scripts and refine script id handling 
(#3691)
    
    * Refactor script identification and enforce explicit names in global 
Scripts container
    
    This commit introduces a clearer distinction between user-defined script 
names and internal script identifiers, and enforces explicit naming for global 
scripts.
    - AbstractScript now provides 'getName()' for user-set names and 'getId()' 
for an internal Id.
    - ScriptsPlugin throws a 'ConfigurationException' if global scripts lack a 
non-blank name via 'getName()'.
    - ScriptManager and its users were updated to utilize 'script.getId()' for 
internal referencing.
    - Added unit tests for 'AbstractScript' and 'ScriptsPlugin'.
    - Updated 'org.apache.logging.log4j.core.script' package-info to version 
2.25.0.
    - Added a changelog entry for issue #3176.
    
    * Refine script handling and improve runtime safety
    
    - Improve null-safety in ScriptsPlugin by throwing an exception for null 
input.
    - Replace unsafe toString() call in AbstractScript constructor with a safer 
internal ID generation.
    - Adjust test cases to align with code changes and project conventions.
    - Update OSGi @Version annotation to 2.26.0 for the next release cycle.
---
 .../log4j/core/config/ScriptsPluginTest.java       | 78 ++++++++++++++++++++++
 .../log4j/core/script/AbstractScriptTest.java      | 71 ++++++++++++++++++++
 .../core/appender/ScriptAppenderSelector.java      |  4 +-
 .../appender/rolling/action/ScriptCondition.java   |  6 +-
 .../log4j/core/appender/routing/Routes.java        |  2 +-
 .../core/appender/routing/RoutingAppender.java     |  2 +-
 .../logging/log4j/core/config/ScriptsPlugin.java   | 20 +++++-
 .../log4j/core/config/arbiters/ScriptArbiter.java  |  6 +-
 .../logging/log4j/core/filter/ScriptFilter.java    | 14 ++--
 .../log4j/core/layout/ScriptPatternSelector.java   |  6 +-
 .../logging/log4j/core/script/AbstractScript.java  | 10 ++-
 .../logging/log4j/core/script/ScriptFile.java      |  4 +-
 .../logging/log4j/core/script/ScriptManager.java   | 28 ++++----
 .../logging/log4j/core/script/ScriptRef.java       |  6 +-
 .../logging/log4j/core/script/package-info.java    |  2 +-
 .../3176_validate_scripts_in_ScriptsPlugin.xml     | 13 ++++
 16 files changed, 230 insertions(+), 42 deletions(-)

diff --git 
a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/config/ScriptsPluginTest.java
 
b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/config/ScriptsPluginTest.java
new file mode 100644
index 0000000000..0ea1acd6ef
--- /dev/null
+++ 
b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/config/ScriptsPluginTest.java
@@ -0,0 +1,78 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to you under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.logging.log4j.core.config;
+
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertSame;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+import org.apache.logging.log4j.core.script.AbstractScript;
+import org.junit.jupiter.api.Test;
+
+class ScriptsPluginTest {
+
+    @Test
+    void testCreateScriptsNullInput() {
+        assertThrows(NullPointerException.class, () -> 
ScriptsPlugin.createScripts(null));
+    }
+
+    @Test
+    void testCreateScriptsEmptyInput() {
+        AbstractScript[] emptyArray = new AbstractScript[0];
+        assertSame(emptyArray, ScriptsPlugin.createScripts(emptyArray), 
"Should return empty array");
+    }
+
+    @Test
+    void testCreateScriptsAllExplicitNames() {
+        AbstractScript script1 = new MockScript("script1", "JavaScript", 
"text");
+        AbstractScript script2 = new MockScript("script2", "Groovy", "text");
+        AbstractScript[] input = {script1, script2};
+        AbstractScript[] result = ScriptsPlugin.createScripts(input);
+        assertEquals(2, result.length, "Should return 2 scripts");
+        assertArrayEquals(input, result, "Should contain all valid scripts");
+    }
+
+    @Test
+    void testCreateScriptsImplicitName() {
+        AbstractScript script = new MockScript(null, "JavaScript", "text");
+        AbstractScript[] input = {script};
+        assertThrows(ConfigurationException.class, () -> 
ScriptsPlugin.createScripts(input));
+    }
+
+    @Test
+    void testCreateScriptsBlankName() {
+        AbstractScript script = new MockScript("  ", "JavaScript", "text");
+        AbstractScript[] input = {script};
+        assertThrows(ConfigurationException.class, () -> 
ScriptsPlugin.createScripts(input));
+    }
+
+    @Test
+    void testCreateScriptsMixedExplicitAndImplicitNames() {
+        AbstractScript explicitScript = new MockScript("script", "Python", 
"text");
+        AbstractScript implicitScript = new MockScript(null, "JavaScript", 
"text");
+        AbstractScript[] input = {explicitScript, implicitScript};
+        assertThrows(ConfigurationException.class, () -> 
ScriptsPlugin.createScripts(input));
+    }
+
+    private class MockScript extends AbstractScript {
+
+        public MockScript(String name, String language, String scriptText) {
+            super(name, language, scriptText);
+        }
+    }
+}
diff --git 
a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/script/AbstractScriptTest.java
 
b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/script/AbstractScriptTest.java
new file mode 100644
index 0000000000..d4cbef5606
--- /dev/null
+++ 
b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/script/AbstractScriptTest.java
@@ -0,0 +1,71 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to you under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.logging.log4j.core.script;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+
+import org.junit.jupiter.api.Test;
+
+class AbstractScriptTest {
+
+    @Test
+    void testConstructorAndGettersWithExplicitName() {
+        final String lang = "JavaScript";
+        final String text = "text";
+        final String name = "script";
+        final AbstractScript script = new MockScript(name, lang, text);
+
+        assertEquals(lang, script.getLanguage(), "Language should match");
+        assertEquals(text, script.getScriptText(), "Script text should match");
+        assertEquals(name, script.getName(), "Name should match the provided 
name");
+        assertEquals(name, script.getId(), "Id should match the provided 
name");
+    }
+
+    @Test
+    void testConstructorAndGettersWithImplicitName() {
+        final String lang = "JavaScript";
+        final String text = "text";
+        final AbstractScript script = new MockScript(null, lang, text);
+
+        assertEquals(lang, script.getLanguage(), "Language should match");
+        assertEquals(text, script.getScriptText(), "Script text should match");
+        assertNull(script.getName(), "Name should be null");
+        assertNotNull(script.getId(), "Id should not be null");
+    }
+
+    @Test
+    void testConstructorAndGettersWithBlankName() {
+        final String lang = "JavaScript";
+        final String text = "text";
+        final String name = "  ";
+        final AbstractScript script = new MockScript(name, lang, text);
+
+        assertEquals(lang, script.getLanguage(), "Language should match");
+        assertEquals(text, script.getScriptText(), "Script text should match");
+        assertEquals(name, script.getName(), "Name should be blank");
+        assertNotNull(script.getId(), "Id should not be null");
+    }
+
+    private class MockScript extends AbstractScript {
+
+        public MockScript(String name, String language, String scriptText) {
+            super(name, language, scriptText);
+        }
+    }
+}
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/ScriptAppenderSelector.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/ScriptAppenderSelector.java
index 200fa47ec7..efbd93e433 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/ScriptAppenderSelector.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/ScriptAppenderSelector.java
@@ -94,9 +94,9 @@ public class ScriptAppenderSelector extends AbstractAppender {
                     "ScriptAppenderSelector '{}' executing {} '{}': {}",
                     name,
                     script.getLanguage(),
-                    script.getName(),
+                    script.getId(),
                     script.getScriptText());
-            final Object object = scriptManager.execute(script.getName(), 
bindings);
+            final Object object = scriptManager.execute(script.getId(), 
bindings);
             final String actualAppenderName = Objects.toString(object, null);
             LOGGER.debug("ScriptAppenderSelector '{}' selected '{}'", name, 
actualAppenderName);
             return appenderSet.createAppender(actualAppenderName, name);
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/ScriptCondition.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/ScriptCondition.java
index 3519980c2a..b87eff7ccc 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/ScriptCondition.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/action/ScriptCondition.java
@@ -73,7 +73,7 @@ public class ScriptCondition {
         bindings.put("configuration", configuration);
         bindings.put("substitutor", configuration.getStrSubstitutor());
         bindings.put("statusLogger", LOGGER);
-        final Object object = 
configuration.getScriptManager().execute(script.getName(), bindings);
+        final Object object = 
configuration.getScriptManager().execute(script.getId(), bindings);
         return (List<PathWithAttributes>) object;
     }
 
@@ -110,8 +110,8 @@ public class ScriptCondition {
             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());
+            if (configuration.getScriptManager().getScript(script.getId()) == 
null) {
+                LOGGER.error("ScriptCondition: No script with name {} has been 
declared.", script.getId());
                 return null;
             }
         } else {
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 cb5a452ef2..9ca37c15cb 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
@@ -180,7 +180,7 @@ public final class Routes {
             final Bindings bindings = 
scriptManager.createBindings(patternScript);
             bindings.put(STATIC_VARIABLES_KEY, scriptStaticVariables);
             bindings.put(LOG_EVENT_KEY, event);
-            final Object object = 
scriptManager.execute(patternScript.getName(), bindings);
+            final Object object = scriptManager.execute(patternScript.getId(), 
bindings);
             bindings.remove(LOG_EVENT_KEY);
             return Objects.toString(object, null);
         }
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 14aadb1afb..d3d0a3c5bc 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
@@ -202,7 +202,7 @@ public final class RoutingAppender extends AbstractAppender 
{
                 final ScriptManager scriptManager = 
configuration.getScriptManager();
                 final Bindings bindings = 
scriptManager.createBindings(defaultRouteScript);
                 bindings.put(STATIC_VARIABLES_KEY, scriptStaticVariables);
-                final Object object = 
scriptManager.execute(defaultRouteScript.getName(), bindings);
+                final Object object = 
scriptManager.execute(defaultRouteScript.getId(), bindings);
                 final Route route = routes.getRoute(Objects.toString(object, 
null));
                 if (route != null) {
                     defaultRoute = route;
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/ScriptsPlugin.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/ScriptsPlugin.java
index 055081d1d8..4ad19b6fb0 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/ScriptsPlugin.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/ScriptsPlugin.java
@@ -16,15 +16,21 @@
  */
 package org.apache.logging.log4j.core.config;
 
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
 import org.apache.logging.log4j.core.Core;
 import org.apache.logging.log4j.core.config.plugins.Plugin;
 import org.apache.logging.log4j.core.config.plugins.PluginElement;
 import org.apache.logging.log4j.core.config.plugins.PluginFactory;
 import org.apache.logging.log4j.core.script.AbstractScript;
+import org.apache.logging.log4j.util.Strings;
+import org.jspecify.annotations.NullMarked;
 
 /**
  * A  container of Scripts.
  */
+@NullMarked
 @Plugin(name = "Scripts", category = Core.CATEGORY_NAME)
 public final class ScriptsPlugin {
 
@@ -37,7 +43,19 @@ public final class ScriptsPlugin {
      */
     @PluginFactory
     public static AbstractScript[] createScripts(@PluginElement("Scripts") 
final AbstractScript[] scripts) {
+        Objects.requireNonNull(scripts, "Scripts array cannot be null");
+        if (scripts.length == 0) {
+            return scripts;
+        }
 
-        return scripts;
+        final List<AbstractScript> validScripts = new 
ArrayList<>(scripts.length);
+        for (final AbstractScript script : scripts) {
+            if (Strings.isBlank(script.getName())) {
+                throw new ConfigurationException("A script defined in 
<Scripts> lacks an explicit 'name' attribute");
+            } else {
+                validScripts.add(script);
+            }
+        }
+        return validScripts.toArray(new AbstractScript[0]);
     }
 }
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/arbiters/ScriptArbiter.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/arbiters/ScriptArbiter.java
index d4c96da171..042b36a814 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/arbiters/ScriptArbiter.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/arbiters/ScriptArbiter.java
@@ -57,7 +57,7 @@ public class ScriptArbiter implements Arbiter {
         final SimpleBindings bindings = new SimpleBindings();
         bindings.putAll(configuration.getProperties());
         bindings.put("substitutor", configuration.getStrSubstitutor());
-        final Object object = 
configuration.getScriptManager().execute(script.getName(), bindings);
+        final Object object = 
configuration.getScriptManager().execute(script.getId(), bindings);
         return Boolean.parseBoolean(object.toString());
     }
 
@@ -114,8 +114,8 @@ public class ScriptArbiter implements Arbiter {
                 return null;
             }
             if (script instanceof ScriptRef) {
-                if 
(configuration.getScriptManager().getScript(script.getName()) == null) {
-                    LOGGER.error("No script with name {} has been declared.", 
script.getName());
+                if (configuration.getScriptManager().getScript(script.getId()) 
== null) {
+                    LOGGER.error("No script with name {} has been declared.", 
script.getId());
                     return null;
                 }
             } else {
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/ScriptFilter.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/ScriptFilter.java
index 066dc7aa13..cec83951e3 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/ScriptFilter.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/ScriptFilter.java
@@ -69,7 +69,7 @@ public final class ScriptFilter extends AbstractFilter {
         bindings.put("throwable", null);
         bindings.putAll(configuration.getProperties());
         bindings.put("substitutor", configuration.getStrSubstitutor());
-        final Object object = 
configuration.getScriptManager().execute(script.getName(), bindings);
+        final Object object = 
configuration.getScriptManager().execute(script.getId(), bindings);
         return object == null || !Boolean.TRUE.equals(object) ? onMismatch : 
onMatch;
     }
 
@@ -85,7 +85,7 @@ public final class ScriptFilter extends AbstractFilter {
         bindings.put("throwable", t);
         bindings.putAll(configuration.getProperties());
         bindings.put("substitutor", configuration.getStrSubstitutor());
-        final Object object = 
configuration.getScriptManager().execute(script.getName(), bindings);
+        final Object object = 
configuration.getScriptManager().execute(script.getId(), bindings);
         return object == null || !Boolean.TRUE.equals(object) ? onMismatch : 
onMatch;
     }
 
@@ -101,7 +101,7 @@ public final class ScriptFilter extends AbstractFilter {
         bindings.put("throwable", t);
         bindings.putAll(configuration.getProperties());
         bindings.put("substitutor", configuration.getStrSubstitutor());
-        final Object object = 
configuration.getScriptManager().execute(script.getName(), bindings);
+        final Object object = 
configuration.getScriptManager().execute(script.getId(), bindings);
         return object == null || !Boolean.TRUE.equals(object) ? onMismatch : 
onMatch;
     }
 
@@ -111,13 +111,13 @@ public final class ScriptFilter extends AbstractFilter {
         bindings.put("logEvent", event);
         bindings.putAll(configuration.getProperties());
         bindings.put("substitutor", configuration.getStrSubstitutor());
-        final Object object = 
configuration.getScriptManager().execute(script.getName(), bindings);
+        final Object object = 
configuration.getScriptManager().execute(script.getId(), bindings);
         return object == null || !Boolean.TRUE.equals(object) ? onMismatch : 
onMatch;
     }
 
     @Override
     public String toString() {
-        return script.getName();
+        return script.getId();
     }
 
     /**
@@ -146,8 +146,8 @@ public final class ScriptFilter extends AbstractFilter {
             return null;
         }
         if (script instanceof ScriptRef) {
-            if (configuration.getScriptManager().getScript(script.getName()) 
== null) {
-                logger.error("No script with name {} has been declared.", 
script.getName());
+            if (configuration.getScriptManager().getScript(script.getId()) == 
null) {
+                logger.error("No script with name {} has been declared.", 
script.getId());
                 return null;
             }
         } else {
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/ScriptPatternSelector.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/ScriptPatternSelector.java
index 92648e24d4..f1e4d240f3 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/ScriptPatternSelector.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/ScriptPatternSelector.java
@@ -89,8 +89,8 @@ public class ScriptPatternSelector implements 
PatternSelector, LocationAware {
                 return null;
             }
             if (script instanceof ScriptRef) {
-                if 
(configuration.getScriptManager().getScript(script.getName()) == null) {
-                    LOGGER.error("No script with name {} has been declared.", 
script.getName());
+                if (configuration.getScriptManager().getScript(script.getId()) 
== null) {
+                    LOGGER.error("No script with name {} has been declared.", 
script.getId());
                     return null;
                 }
             } else {
@@ -262,7 +262,7 @@ public class ScriptPatternSelector implements 
PatternSelector, LocationAware {
         bindings.putAll(configuration.getProperties());
         bindings.put("substitutor", configuration.getStrSubstitutor());
         bindings.put("logEvent", event);
-        final Object object = 
configuration.getScriptManager().execute(script.getName(), bindings);
+        final Object object = 
configuration.getScriptManager().execute(script.getId(), bindings);
         if (object == null) {
             return defaultFormatters;
         }
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/script/AbstractScript.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/script/AbstractScript.java
index d43ab2a452..1242d59ac3 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/script/AbstractScript.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/script/AbstractScript.java
@@ -16,8 +16,10 @@
  */
 package org.apache.logging.log4j.core.script;
 
+import java.util.Objects;
 import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.status.StatusLogger;
+import org.apache.logging.log4j.util.Strings;
 
 /**
  * Container for the language and body of a script.
@@ -30,11 +32,13 @@ public abstract class AbstractScript {
     private final String language;
     private final String scriptText;
     private final String name;
+    private final String id;
 
     public AbstractScript(final String name, final String language, final 
String scriptText) {
         this.language = language;
         this.scriptText = scriptText;
-        this.name = name == null ? this.toString() : name;
+        this.name = name;
+        this.id = Strings.isBlank(name) ? 
Integer.toHexString(Objects.hashCode(this)) : name;
     }
 
     public String getLanguage() {
@@ -48,4 +52,8 @@ public abstract class AbstractScript {
     public String getName() {
         return this.name;
     }
+
+    public String getId() {
+        return this.id;
+    }
 }
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/script/ScriptFile.java 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/script/ScriptFile.java
index 5ff0b27d34..8f55ab48cb 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/script/ScriptFile.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/script/ScriptFile.java
@@ -123,8 +123,8 @@ public class ScriptFile extends AbstractScript {
     @Override
     public String toString() {
         final StringBuilder sb = new StringBuilder();
-        if (!(getName().equals(filePath.toString()))) {
-            sb.append("name=").append(getName()).append(", ");
+        if (!(getId().equals(filePath.toString()))) {
+            sb.append("name=").append(getId()).append(", ");
         }
         sb.append("path=").append(filePath);
         if (getLanguage() != null) {
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 5d87f925ae..1409800bea 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
@@ -147,9 +147,9 @@ public class ScriptManager implements FileWatcher {
                 return false;
             }
             if (engine.getFactory().getParameter(KEY_THREADING) == null) {
-                scriptRunners.put(script.getName(), new 
ThreadLocalScriptRunner(script));
+                scriptRunners.put(script.getId(), new 
ThreadLocalScriptRunner(script));
             } else {
-                scriptRunners.put(script.getName(), new 
MainScriptRunner(engine, script));
+                scriptRunners.put(script.getId(), new MainScriptRunner(engine, 
script));
             }
 
             if (script instanceof ScriptFile) {
@@ -162,7 +162,7 @@ public class ScriptManager implements FileWatcher {
         } else {
             logger.error(
                     "Unable to add script {}, {} has not been configured as an 
allowed language",
-                    script.getName(),
+                    script.getId(),
                     script.getLanguage());
             return false;
         }
@@ -173,8 +173,8 @@ public class ScriptManager implements FileWatcher {
         return getScriptRunner(script).createBindings();
     }
 
-    public AbstractScript getScript(final String name) {
-        final ScriptRunner runner = scriptRunners.get(name);
+    public AbstractScript getScript(final String id) {
+        final ScriptRunner runner = scriptRunners.get(id);
         return runner != null ? runner.getScript() : null;
     }
 
@@ -188,16 +188,16 @@ public class ScriptManager implements FileWatcher {
         final ScriptEngine engine = runner.getScriptEngine();
         final AbstractScript script = runner.getScript();
         if (engine.getFactory().getParameter(KEY_THREADING) == null) {
-            scriptRunners.put(script.getName(), new 
ThreadLocalScriptRunner(script));
+            scriptRunners.put(script.getId(), new 
ThreadLocalScriptRunner(script));
         } else {
-            scriptRunners.put(script.getName(), new MainScriptRunner(engine, 
script));
+            scriptRunners.put(script.getId(), new MainScriptRunner(engine, 
script));
         }
     }
 
-    public Object execute(final String name, final Bindings bindings) {
-        final ScriptRunner scriptRunner = scriptRunners.get(name);
+    public Object execute(final String id, final Bindings bindings) {
+        final ScriptRunner scriptRunner = scriptRunners.get(id);
         if (scriptRunner == null) {
-            logger.warn("No script named {} could be found", name);
+            logger.warn("No script named {} could be found", id);
             return null;
         }
         return AccessController.doPrivileged((PrivilegedAction<Object>) () -> 
scriptRunner.execute(bindings));
@@ -224,7 +224,7 @@ public class ScriptManager implements FileWatcher {
             this.scriptEngine = scriptEngine;
             CompiledScript compiled = null;
             if (scriptEngine instanceof Compilable) {
-                logger.debug("Script {} is compilable", script.getName());
+                logger.debug("Script {} is compilable", script.getId());
                 compiled = 
AccessController.doPrivileged((PrivilegedAction<CompiledScript>) () -> {
                     try {
                         return ((Compilable) 
scriptEngine).compile(script.getScriptText());
@@ -252,14 +252,14 @@ public class ScriptManager implements FileWatcher {
                 try {
                     return compiledScript.eval(bindings);
                 } catch (final ScriptException ex) {
-                    logger.error("Error running script " + script.getName(), 
ex);
+                    logger.error("Error running script " + script.getId(), ex);
                     return null;
                 }
             }
             try {
                 return scriptEngine.eval(script.getScriptText(), bindings);
             } catch (final ScriptException ex) {
-                logger.error("Error running script " + script.getName(), ex);
+                logger.error("Error running script " + script.getId(), ex);
                 return null;
             }
         }
@@ -302,6 +302,6 @@ public class ScriptManager implements FileWatcher {
     }
 
     private ScriptRunner getScriptRunner(final AbstractScript script) {
-        return scriptRunners.get(script.getName());
+        return scriptRunners.get(script.getId());
     }
 }
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/script/ScriptRef.java 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/script/ScriptRef.java
index a809f25e9d..d9bb3df31a 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/script/ScriptRef.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/script/ScriptRef.java
@@ -38,13 +38,13 @@ public class ScriptRef extends AbstractScript {
 
     @Override
     public String getLanguage() {
-        final AbstractScript script = this.scriptManager.getScript(getName());
+        final AbstractScript script = this.scriptManager.getScript(getId());
         return script != null ? script.getLanguage() : null;
     }
 
     @Override
     public String getScriptText() {
-        final AbstractScript script = this.scriptManager.getScript(getName());
+        final AbstractScript script = this.scriptManager.getScript(getId());
         return script != null ? script.getScriptText() : null;
     }
 
@@ -62,6 +62,6 @@ public class ScriptRef extends AbstractScript {
 
     @Override
     public String toString() {
-        return "ref=" + getName();
+        return "ref=" + getId();
     }
 }
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/script/package-info.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/script/package-info.java
index d973435b64..1374fe6673 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/script/package-info.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/script/package-info.java
@@ -18,7 +18,7 @@
  * Log4j 2 Script support.
  */
 @Export
-@Version("2.20.2")
+@Version("2.26.0")
 package org.apache.logging.log4j.core.script;
 
 import org.osgi.annotation.bundle.Export;
diff --git a/src/changelog/.2.x.x/3176_validate_scripts_in_ScriptsPlugin.xml 
b/src/changelog/.2.x.x/3176_validate_scripts_in_ScriptsPlugin.xml
new file mode 100644
index 0000000000..0246396937
--- /dev/null
+++ b/src/changelog/.2.x.x/3176_validate_scripts_in_ScriptsPlugin.xml
@@ -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="changed">
+    <issue id="3176" 
link="https://github.com/apache/logging-log4j2/issues/3176"/>
+    <description format="asciidoc">
+      Ensured scripts in global `Scripts container` have explicit names by 
throwing a `ConfigurationException` for unnamed ones.
+      Refined script identification with `AbstractScript.getId()` and 
clarified `AbstractScript.getName()`.
+    </description>
+</entry>

Reply via email to