From 5fcfb80adabf22e1805ff5978d336f0e3e32bb11 Mon Sep 17 00:00:00 2001 From: "Piotr P. Karwasz" Date: Thu, 28 Jul 2022 22:21:53 +0200 Subject: [PATCH 1/8] [LOG4J2-3564] Fix NPE when root logger level is null `LogManager.getGlobal().getLevel()` is not a good fallback for the case when all JUL logger levels are null, since its level is usually null. --- .../apache/logging/log4j/tojul/JULLogger.java | 5 +-- .../logging/log4j/tojul/package-info.java | 2 +- .../logging/log4j/tojul/JULLoggerTest.java | 34 +++++++++++++++++++ 3 files changed, 38 insertions(+), 3 deletions(-) create mode 100644 log4j-to-jul/src/test/java/org/apache/logging/log4j/tojul/JULLoggerTest.java diff --git a/log4j-to-jul/src/main/java/org/apache/logging/log4j/tojul/JULLogger.java b/log4j-to-jul/src/main/java/org/apache/logging/log4j/tojul/JULLogger.java index 3d391aa2427..11081071574 100644 --- a/log4j-to-jul/src/main/java/org/apache/logging/log4j/tojul/JULLogger.java +++ b/log4j-to-jul/src/main/java/org/apache/logging/log4j/tojul/JULLogger.java @@ -32,7 +32,7 @@ * * @author Michael Vorburger.ch for Google */ -public final class JULLogger extends AbstractLogger { +final class JULLogger extends AbstractLogger { private static final long serialVersionUID = 1L; private final Logger logger; @@ -162,7 +162,8 @@ private java.util.logging.Level getEffectiveJULLevel() { } // This is a safety fallback that is typically never reached, because usually the root Logger.getLogger("") has // a Level. - return Logger.getGlobal().getLevel(); + // Since JDK 8 the LogManager$RootLogger does not have a default level, just a default effective level of INFO. + return java.util.logging.Level.INFO; } private boolean isEnabledFor(final Level level, final Marker marker) { diff --git a/log4j-to-jul/src/main/java/org/apache/logging/log4j/tojul/package-info.java b/log4j-to-jul/src/main/java/org/apache/logging/log4j/tojul/package-info.java index f333fffe246..8e3755f4d73 100644 --- a/log4j-to-jul/src/main/java/org/apache/logging/log4j/tojul/package-info.java +++ b/log4j-to-jul/src/main/java/org/apache/logging/log4j/tojul/package-info.java @@ -21,7 +21,7 @@ * @author Michael Vorburger.ch for Google */ @Export -@Version("2.20.1") +@Version("3.0.0") package org.apache.logging.log4j.tojul; import org.osgi.annotation.bundle.Export; diff --git a/log4j-to-jul/src/test/java/org/apache/logging/log4j/tojul/JULLoggerTest.java b/log4j-to-jul/src/test/java/org/apache/logging/log4j/tojul/JULLoggerTest.java new file mode 100644 index 00000000000..9f70a01b28b --- /dev/null +++ b/log4j-to-jul/src/test/java/org/apache/logging/log4j/tojul/JULLoggerTest.java @@ -0,0 +1,34 @@ +/* + * 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.tojul; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import org.apache.logging.log4j.Level; +import org.junit.jupiter.api.Test; + +public class JULLoggerTest { + + @Test + public void testNotNullEffectiveLevel() { + // Emulates the root logger found in Tomcat, with a null level + // See: https://bz.apache.org/bugzilla/show_bug.cgi?id=66184 + final java.util.logging.Logger julLogger = new java.util.logging.Logger("", null) {}; + final JULLogger logger = new JULLogger("", julLogger); + assertEquals(Level.INFO, logger.getLevel()); + } +} From 9694b7577597e05d646c2e95fd88cc57b3a1ae85 Mon Sep 17 00:00:00 2001 From: "Piotr P. Karwasz" Date: Tue, 2 Jan 2024 12:48:43 +0100 Subject: [PATCH 2/8] Sync 2.x and 3.x version of `log4j-to-jul` --- log4j-to-jul/pom.xml | 3 --- .../main/java/org/apache/logging/log4j/tojul/JULProvider.java | 3 +-- .../org/apache/logging/log4j/tojul/{test => }/LoggerTest.java | 3 +-- 3 files changed, 2 insertions(+), 7 deletions(-) rename log4j-to-jul/src/test/java/org/apache/logging/log4j/tojul/{test => }/LoggerTest.java (99%) diff --git a/log4j-to-jul/pom.xml b/log4j-to-jul/pom.xml index 576366f795a..dabbf5da95f 100644 --- a/log4j-to-jul/pom.xml +++ b/log4j-to-jul/pom.xml @@ -29,9 +29,6 @@ Apache Log4j to JUL Bridge The Apache Log4j binding between Log4j 2 API and java.util.logging (JUL). 2022 - - ${basedir}/.. - org.apache.logging.log4j diff --git a/log4j-to-jul/src/main/java/org/apache/logging/log4j/tojul/JULProvider.java b/log4j-to-jul/src/main/java/org/apache/logging/log4j/tojul/JULProvider.java index cc2cb76ee79..1dd41a528d7 100644 --- a/log4j-to-jul/src/main/java/org/apache/logging/log4j/tojul/JULProvider.java +++ b/log4j-to-jul/src/main/java/org/apache/logging/log4j/tojul/JULProvider.java @@ -16,7 +16,6 @@ */ package org.apache.logging.log4j.tojul; -import aQute.bnd.annotation.Resolution; import aQute.bnd.annotation.spi.ServiceProvider; import org.apache.logging.log4j.spi.Provider; @@ -25,7 +24,7 @@ * * @author Michael Vorburger.ch for Google */ -@ServiceProvider(value = Provider.class, resolution = Resolution.OPTIONAL) +@ServiceProvider(value = Provider.class) public class JULProvider extends Provider { public JULProvider() { super(20, "3.0.0", JULLoggerContextFactory.class, null); diff --git a/log4j-to-jul/src/test/java/org/apache/logging/log4j/tojul/test/LoggerTest.java b/log4j-to-jul/src/test/java/org/apache/logging/log4j/tojul/LoggerTest.java similarity index 99% rename from log4j-to-jul/src/test/java/org/apache/logging/log4j/tojul/test/LoggerTest.java rename to log4j-to-jul/src/test/java/org/apache/logging/log4j/tojul/LoggerTest.java index ac6777249dc..c2d65199aae 100644 --- a/log4j-to-jul/src/test/java/org/apache/logging/log4j/tojul/test/LoggerTest.java +++ b/log4j-to-jul/src/test/java/org/apache/logging/log4j/tojul/LoggerTest.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.logging.log4j.tojul.test; +package org.apache.logging.log4j.tojul; import static org.assertj.core.api.Assertions.assertThat; @@ -24,7 +24,6 @@ import java.util.logging.Level; import java.util.logging.LogRecord; import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.tojul.JULLogger; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; From 51f7b829a1f0260289e8a4dc1ecbb273542fae31 Mon Sep 17 00:00:00 2001 From: "Piotr P. Karwasz" Date: Wed, 20 Dec 2023 09:34:02 +0100 Subject: [PATCH 3/8] Workaround Coursier/Ivy dependency resolution bug Workaround a Coursier/Ivy dependency resolution bug that affects `log4j-slf4j-impl` and `log4j-mongodb3`. This bug also affects popular sites like MvnRepository (cf. [`log4j-mongodb3:2.22.0`](https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-mongodb3/2.22.0)). Closes #2065 --- log4j-slf4j-impl/pom.xml | 32 ++++++++++++++++--- .../.3.x.x/workaround_coursier_bug.xml | 10 ++++++ 2 files changed, 37 insertions(+), 5 deletions(-) create mode 100644 src/changelog/.3.x.x/workaround_coursier_bug.xml diff --git a/log4j-slf4j-impl/pom.xml b/log4j-slf4j-impl/pom.xml index 2b973cf73d0..cd9b4d4b93d 100644 --- a/log4j-slf4j-impl/pom.xml +++ b/log4j-slf4j-impl/pom.xml @@ -31,6 +31,19 @@ 1.7.36 + + + + + + org.slf4j + slf4j-api + ${slf4j.version} + + + + org.osgi @@ -54,6 +67,12 @@ org.apache.logging.log4j log4j-api-test test + + + org.slf4j + slf4j-api + + org.apache.logging.log4j @@ -64,6 +83,12 @@ org.apache.logging.log4j log4j-to-slf4j test + + + org.slf4j + slf4j-api + + org.apache.commons @@ -75,11 +100,6 @@ commons-lang3 test - - org.hamcrest - hamcrest - test - org.junit.jupiter junit-jupiter-engine @@ -93,6 +113,7 @@ + org.apache.maven.plugins maven-surefire-plugin @@ -129,6 +150,7 @@ + diff --git a/src/changelog/.3.x.x/workaround_coursier_bug.xml b/src/changelog/.3.x.x/workaround_coursier_bug.xml new file mode 100644 index 00000000000..7e78be130f6 --- /dev/null +++ b/src/changelog/.3.x.x/workaround_coursier_bug.xml @@ -0,0 +1,10 @@ + + + + + Workaround a Coursier/Ivy dependency resolution bug affecting `log4j-slf4j-impl` and `log4j-mongodb3`. + + From 8ead919bbfd2a9cf4866d4d6655da0000bd6147f Mon Sep 17 00:00:00 2001 From: "Piotr P. Karwasz" Date: Wed, 3 Jan 2024 15:00:23 +0100 Subject: [PATCH 4/8] Port `log4j-slf4j-impl` changes from `2.x` --- log4j-slf4j-impl/src/assembly/slf4j.xml | 36 ------------------- .../apache/logging/slf4j/package-info.java | 2 +- 2 files changed, 1 insertion(+), 37 deletions(-) delete mode 100644 log4j-slf4j-impl/src/assembly/slf4j.xml diff --git a/log4j-slf4j-impl/src/assembly/slf4j.xml b/log4j-slf4j-impl/src/assembly/slf4j.xml deleted file mode 100644 index 966f702adaa..00000000000 --- a/log4j-slf4j-impl/src/assembly/slf4j.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - - src - - zip - - / - - - ${project.build.outputDirectory} - /classes - - **/*.class - - - org/slf4j/impl/*.class - - - - diff --git a/log4j-slf4j-impl/src/main/java/org/apache/logging/slf4j/package-info.java b/log4j-slf4j-impl/src/main/java/org/apache/logging/slf4j/package-info.java index 511a8c77c3f..55be6ffc4e1 100644 --- a/log4j-slf4j-impl/src/main/java/org/apache/logging/slf4j/package-info.java +++ b/log4j-slf4j-impl/src/main/java/org/apache/logging/slf4j/package-info.java @@ -21,7 +21,7 @@ */ @Export @Header(name = Constants.BUNDLE_ACTIVATIONPOLICY, value = Constants.ACTIVATION_LAZY) -@Version("2.21.0") +@Version("2.23.0") package org.apache.logging.slf4j; import org.osgi.annotation.bundle.Export; From 4c9ca59e0d7e413c08d42ff89b9f76334e2da3ec Mon Sep 17 00:00:00 2001 From: "Piotr P. Karwasz" Date: Wed, 3 Jan 2024 16:34:35 +0100 Subject: [PATCH 5/8] Fix BND baseline failure (`log4j-slf4j-impl`) --- log4j-slf4j-impl/pom.xml | 1 + .../src/main/java/org/apache/logging/slf4j/package-info.java | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/log4j-slf4j-impl/pom.xml b/log4j-slf4j-impl/pom.xml index cd9b4d4b93d..1e5778b989e 100644 --- a/log4j-slf4j-impl/pom.xml +++ b/log4j-slf4j-impl/pom.xml @@ -30,6 +30,7 @@ The Apache Log4j SLF4J API binding to Log4j 2 Core 1.7.36 + false + false diff --git a/log4j-slf4j2-impl/src/main/java/org/apache/logging/slf4j/package-info.java b/log4j-slf4j2-impl/src/main/java/org/apache/logging/slf4j/package-info.java index 511a8c77c3f..d847bc764bb 100644 --- a/log4j-slf4j2-impl/src/main/java/org/apache/logging/slf4j/package-info.java +++ b/log4j-slf4j2-impl/src/main/java/org/apache/logging/slf4j/package-info.java @@ -21,7 +21,7 @@ */ @Export @Header(name = Constants.BUNDLE_ACTIVATIONPOLICY, value = Constants.ACTIVATION_LAZY) -@Version("2.21.0") +@Version("3.0.0") package org.apache.logging.slf4j; import org.osgi.annotation.bundle.Export; From b89d7587464cd4e789febd5eea6a09d0be95603d Mon Sep 17 00:00:00 2001 From: "Piotr P. Karwasz" Date: Wed, 3 Jan 2024 17:30:24 +0100 Subject: [PATCH 8/8] Port `log4j-script` changes from `2.x` This PR adds to the `log4j-script` module the missing changes from the `2.x` branch. Since the module was created by moving classes from `log4j-core` the comparison between branches must be done file by file. --- .../log4j/core/pattern/PatternFormatter.java | 6 ++++++ .../logging/log4j/script/ScriptManagerImpl.java | 11 ++++++----- .../logging/log4j/script/ScriptPlugin.java | 6 +++--- .../script/appender/ScriptAppenderSelector.java | 16 ++++++++-------- .../appender/rolling/action/ScriptCondition.java | 6 +++--- .../script/config/arbiter/ScriptArbiter.java | 6 +++--- .../log4j/script/filter/ScriptFilter.java | 11 +++++------ .../script/layout/ScriptPatternSelector.java | 12 ++++++------ 8 files changed, 40 insertions(+), 34 deletions(-) diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/PatternFormatter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/PatternFormatter.java index 8a35a4d44b7..e946b0d2029 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/PatternFormatter.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/PatternFormatter.java @@ -22,6 +22,12 @@ * */ public class PatternFormatter { + + /** + * The empty array. + */ + public static final PatternFormatter[] EMPTY_ARRAY = {}; + private final LogEventPatternConverter converter; private final FormattingInfo field; private final boolean skipFormattingInfo; 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 32acc88b15f..566ec2135e9 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 @@ -16,13 +16,14 @@ */ package org.apache.logging.log4j.script; +import static org.apache.logging.log4j.util.Strings.toRootLowerCase; + import java.io.File; 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; @@ -86,7 +87,7 @@ public ScriptManagerImpl(final Configuration configuration, final WatchManager w this.watchManager = watchManager; final List factories = manager.getEngineFactories(); allowedLanguages = Arrays.stream(Strings.splitList(scriptLanguages)) - .map(String::toLowerCase) + .map(Strings::toRootLowerCase) .collect(Collectors.toSet()); if (logger.isDebugEnabled()) { final StringBuilder sb = new StringBuilder(); @@ -100,7 +101,7 @@ public ScriptManagerImpl(final Configuration configuration, final WatchManager w final StringBuilder names = new StringBuilder(); final List languageNames = factory.getNames(); for (final String name : languageNames) { - if (allowedLanguages.contains(name.toLowerCase(Locale.ROOT))) { + if (allowedLanguages.contains(toRootLowerCase(name))) { if (names.length() > 0) { names.append(", "); } @@ -132,7 +133,7 @@ public ScriptManagerImpl(final Configuration configuration, final WatchManager w final StringBuilder names = new StringBuilder(); for (final ScriptEngineFactory factory : factories) { for (final String name : factory.getNames()) { - if (allowedLanguages.contains(name.toLowerCase(Locale.ROOT))) { + if (allowedLanguages.contains(toRootLowerCase(name))) { if (names.length() > 0) { names.append(", "); } @@ -165,7 +166,7 @@ public void addScripts(final Node child) { } public boolean addScript(final Script script) { - if (allowedLanguages.contains(script.getLanguage().toLowerCase(Locale.ROOT))) { + if (allowedLanguages.contains(toRootLowerCase(script.getLanguage()))) { final ScriptEngine engine = manager.getEngineByName(script.getLanguage()); if (engine == null) { logger.error("No ScriptEngine found for language " + script.getLanguage() diff --git a/log4j-script/src/main/java/org/apache/logging/log4j/script/ScriptPlugin.java b/log4j-script/src/main/java/org/apache/logging/log4j/script/ScriptPlugin.java index 5ac7a3bcafb..6144f474ad5 100644 --- a/log4j-script/src/main/java/org/apache/logging/log4j/script/ScriptPlugin.java +++ b/log4j-script/src/main/java/org/apache/logging/log4j/script/ScriptPlugin.java @@ -40,9 +40,9 @@ public ScriptPlugin(final String name, final String language, final String scrip @PluginFactory public static ScriptPlugin createScript( // @formatter:off - @PluginAttribute final String name, - @PluginAttribute String language, - @PluginValue final String scriptText) { + @PluginAttribute("name") final String name, + @PluginAttribute(ATTR_LANGUAGE) String language, + @PluginValue(ATTR_SCRIPT_TEXT) final String scriptText) { // @formatter:on if (language == null) { LOGGER.error("No '{}' attribute provided for {} plugin '{}'", ATTR_LANGUAGE, PLUGIN_NAME, name); 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 d46f7e3be88..1272c8b6715 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 @@ -17,7 +17,6 @@ package org.apache.logging.log4j.script.appender; import java.util.Objects; -import org.apache.logging.log4j.core.AbstractLifeCycle; import org.apache.logging.log4j.core.Appender; import org.apache.logging.log4j.core.Filter; import org.apache.logging.log4j.core.Layout; @@ -65,19 +64,19 @@ public static final class Builder implements org.apache.logging.log4j.plugins.ut @Override public Appender build() { if (name == null) { - AbstractLifeCycle.LOGGER.error("Name missing."); + LOGGER.error("Name missing."); return null; } if (script == null) { - AbstractLifeCycle.LOGGER.error("Script missing for ScriptAppenderSelector appender {}", name); + LOGGER.error("Script missing for ScriptAppenderSelector appender {}", name); return null; } if (appenderSet == null) { - AbstractLifeCycle.LOGGER.error("AppenderSet missing for ScriptAppenderSelector appender {}", name); + LOGGER.error("AppenderSet missing for ScriptAppenderSelector appender {}", name); return null; } if (configuration == null) { - AbstractLifeCycle.LOGGER.error("Configuration missing for ScriptAppenderSelector appender {}", name); + LOGGER.error("Configuration missing for ScriptAppenderSelector appender {}", name); return null; } final ScriptManager scriptManager = configuration.getScriptManager(); @@ -89,7 +88,7 @@ public Appender build() { return null; } final ScriptBindings bindings = scriptManager.createBindings(script); - AbstractLifeCycle.LOGGER.debug( + LOGGER.debug( "ScriptAppenderSelector '{}' executing {} '{}': {}", name, script.getLanguage(), @@ -97,7 +96,7 @@ public Appender build() { script.getScriptText()); final Object object = scriptManager.execute(script.getName(), bindings); final String actualAppenderName = Objects.toString(object, null); - AbstractLifeCycle.LOGGER.debug("ScriptAppenderSelector '{}' selected '{}'", name, actualAppenderName); + LOGGER.debug("ScriptAppenderSelector '{}' selected '{}'", name, actualAppenderName); return appenderSet.createAppender(actualAppenderName, name); } @@ -143,7 +142,8 @@ public static Builder newBuilder() { return new Builder(); } - private ScriptAppenderSelector(final String name, final Filter filter, final Layout layout) { + private ScriptAppenderSelector( + final String name, final Filter filter, final Layout layout, final Property[] properties) { super(name, filter, layout, true, Property.EMPTY_ARRAY); } 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 adb1891be48..373682397df 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 @@ -62,9 +62,9 @@ public ScriptCondition(final Script script, final Configuration configuration) { /** * Executes the script * - * @param baseDir - * @param candidates - * @return + * @param basePath base directory for files to delete + * @param candidates a list of paths, that can be deleted by the script + * @return a list of paths selected to delete by the script execution */ @SuppressWarnings("unchecked") public List selectFilesToDelete( 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 328fe9949ab..37b57f7c4fa 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 @@ -20,14 +20,14 @@ import org.apache.logging.log4j.core.config.AbstractConfiguration; import org.apache.logging.log4j.core.config.Configuration; import org.apache.logging.log4j.core.config.arbiters.Arbiter; -import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory; import org.apache.logging.log4j.core.config.plugins.PluginConfiguration; -import org.apache.logging.log4j.core.config.plugins.PluginNode; import org.apache.logging.log4j.core.script.Script; import org.apache.logging.log4j.core.script.ScriptBindings; import org.apache.logging.log4j.plugins.Configurable; import org.apache.logging.log4j.plugins.Node; import org.apache.logging.log4j.plugins.Plugin; +import org.apache.logging.log4j.plugins.PluginFactory; +import org.apache.logging.log4j.plugins.PluginNode; import org.apache.logging.log4j.plugins.model.PluginType; import org.apache.logging.log4j.script.ScriptManagerImpl; import org.apache.logging.log4j.script.ScriptRef; @@ -60,7 +60,7 @@ public boolean isCondition() { return Boolean.parseBoolean(object.toString()); } - @PluginBuilderFactory + @PluginFactory public static Builder newBuilder() { return new Builder(); } 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 65f8171f4c6..68734a84359 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 @@ -18,12 +18,10 @@ import org.apache.logging.log4j.Level; import org.apache.logging.log4j.Marker; -import org.apache.logging.log4j.core.AbstractLifeCycle; import org.apache.logging.log4j.core.Filter; import org.apache.logging.log4j.core.LogEvent; import org.apache.logging.log4j.core.Logger; import org.apache.logging.log4j.core.config.Configuration; -import org.apache.logging.log4j.core.config.plugins.PluginConfiguration; import org.apache.logging.log4j.core.filter.AbstractFilter; import org.apache.logging.log4j.core.script.Script; import org.apache.logging.log4j.core.script.ScriptBindings; @@ -31,6 +29,7 @@ import org.apache.logging.log4j.message.ObjectMessage; import org.apache.logging.log4j.message.SimpleMessage; import org.apache.logging.log4j.plugins.Configurable; +import org.apache.logging.log4j.plugins.Inject; import org.apache.logging.log4j.plugins.Plugin; import org.apache.logging.log4j.plugins.PluginAttribute; import org.apache.logging.log4j.plugins.PluginElement; @@ -71,7 +70,7 @@ public Result filter( bindings.putAll(configuration.getProperties()); bindings.put("substitutor", configuration.getStrSubstitutor()); final Object object = configuration.getScriptManager().execute(script.getName(), bindings); - return !Boolean.TRUE.equals(object) ? onMismatch : onMatch; + return object == null || !Boolean.TRUE.equals(object) ? onMismatch : onMatch; } @Override @@ -132,15 +131,15 @@ public String toString() { */ // TODO Consider refactoring to use AbstractFilter.AbstractFilterBuilder @PluginFactory + @Inject public static ScriptFilter createFilter( @PluginElement final Script script, @PluginAttribute final Result onMatch, @PluginAttribute final Result onMismatch, - @PluginConfiguration final Configuration configuration) { + final Configuration configuration) { if (script == null) { - AbstractLifeCycle.LOGGER.error( - "A Script, ScriptFile or ScriptRef element must be provided for this ScriptFilter"); + LOGGER.error("A Script, ScriptFile or ScriptRef element must be provided for this ScriptFilter"); return null; } if (configuration.getScriptManager() == null) { 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 379e732db71..b85b4fa40a9 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 @@ -106,13 +106,13 @@ public ScriptPatternSelector build() { return null; } return new ScriptPatternSelector( + configuration, script, properties, defaultPattern, alwaysWriteExceptions, disableAnsi, - noConsoleNoAnsi, - configuration); + noConsoleNoAnsi); } public Builder setScript(final AbstractScript script) { @@ -165,13 +165,13 @@ public Builder setConfiguration(final Configuration config) { private final boolean requiresLocation; private ScriptPatternSelector( + final Configuration config, final AbstractScript script, final PatternMatch[] properties, final String defaultPattern, final boolean alwaysWriteExceptions, final boolean disableAnsi, - final boolean noConsoleNoAnsi, - final Configuration config) { + final boolean noConsoleNoAnsi) { this.script = script; this.configuration = config; final PatternParser parser = PatternLayout.createPatternParser(config); @@ -180,7 +180,7 @@ private ScriptPatternSelector( try { final List list = parser.parse(property.getPattern(), alwaysWriteExceptions, disableAnsi, noConsoleNoAnsi); - final PatternFormatter[] formatters = list.toArray(new PatternFormatter[list.size()]); + final PatternFormatter[] formatters = list.toArray(PatternFormatter.EMPTY_ARRAY); formatterMap.put(property.getKey(), formatters); patternMap.put(property.getKey(), property.getPattern()); for (int i = 0; !needsLocation && i < formatters.length; ++i) { @@ -193,7 +193,7 @@ private ScriptPatternSelector( try { final List list = parser.parse(defaultPattern, alwaysWriteExceptions, disableAnsi, noConsoleNoAnsi); - defaultFormatters = list.toArray(new PatternFormatter[list.size()]); + defaultFormatters = list.toArray(PatternFormatter.EMPTY_ARRAY); this.defaultPattern = defaultPattern; for (int i = 0; !needsLocation && i < defaultFormatters.length; ++i) { needsLocation = defaultFormatters[i].requiresLocation();