Yes. I still have to modify the configuration builder to add these components to the Scripts element, update the documentation on scripts and document patternSelectors. This is why I didn't want to commit it for 2.4.1 (which I hope to start tonight, depending on my day job).
Ralph > On Oct 7, 2015, at 1:42 AM, Gary Gregory <[email protected]> wrote: > > Ralph, > > Can you provide Javdoc on ScriptRef that explains the difference with > ScriptFile? > > Gary > ---------- Forwarded message ---------- > From: <[email protected]> > Date: Tue, Oct 6, 2015 at 11:12 PM > Subject: logging-log4j2 git commit: LOG4J2-1136 - Add Script references > To: [email protected] > > > Repository: logging-log4j2 > Updated Branches: > refs/heads/LOG4J2-1136 6054027be -> 8aae118a0 > > > LOG4J2-1136 - Add Script references > > > Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo > Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/8aae118a > Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/8aae118a > Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/8aae118a > > Branch: refs/heads/LOG4J2-1136 > Commit: 8aae118a0bd2588fcfe1019bfcefd8753de03893 > Parents: 6054027 > Author: Ralph Goers <[email protected]> > Authored: Tue Oct 6 23:12:32 2015 -0700 > Committer: Ralph Goers <[email protected]> > Committed: Tue Oct 6 23:12:32 2015 -0700 > > ---------------------------------------------------------------------- > .../core/config/AbstractConfiguration.java | 7 ++- > .../log4j/core/config/ScriptsPlugin.java | 43 ++++++++++++++++ > .../logging/log4j/core/filter/ScriptFilter.java | 26 +++++++--- > .../core/layout/ScriptPatternSelector.java | 31 +++++++++--- > .../logging/log4j/core/script/ScriptFile.java | 10 ++-- > .../log4j/core/script/ScriptManager.java | 5 ++ > .../logging/log4j/core/script/ScriptRef.java | 53 ++++++++++++++++++++ > .../log4j/core/filter/ScriptRefFilterTest.java | 37 ++++++++++++++ > .../test/resources/log4j-scriptRef-filters.xml | 47 +++++++++++++++++ > 9 files changed, 242 insertions(+), 17 deletions(-) > ---------------------------------------------------------------------- > > > http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/8aae118a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AbstractConfiguration.java > ---------------------------------------------------------------------- > diff --git > a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AbstractConfiguration.java > > b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AbstractConfiguration.java > index 5481e55..e7d9fdd 100644 > --- > a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AbstractConfiguration.java > +++ > b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AbstractConfiguration.java > @@ -56,6 +56,7 @@ import org.apache.logging.log4j.core.lookup.MapLookup; > import org.apache.logging.log4j.core.lookup.StrLookup; > import org.apache.logging.log4j.core.lookup.StrSubstitutor; > import org.apache.logging.log4j.core.net.Advertiser; > +import org.apache.logging.log4j.core.script.AbstractScript; > import org.apache.logging.log4j.core.script.ScriptManager; > import org.apache.logging.log4j.core.selector.ContextSelector; > import org.apache.logging.log4j.core.util.Constants; > @@ -426,7 +427,11 @@ public abstract class AbstractConfiguration extends > AbstractFilterable implement > if (child.getObject() == null) { > continue; > } > - if (child.getName().equalsIgnoreCase("Appenders")) { > + if (child.getName().equalsIgnoreCase("Scripts")) { > + for (AbstractScript script : > child.getObject(AbstractScript[].class)) { > + scriptManager.addScript(script); > + } > + } else if (child.getName().equalsIgnoreCase("Appenders")) { > appenders = child.getObject(); > } else if (child.isInstanceOf(Filter.class)) { > addFilter(child.getObject(Filter.class)); > > http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/8aae118a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/ScriptsPlugin.java > ---------------------------------------------------------------------- > 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 > new file mode 100644 > index 0000000..bd01dbe > --- /dev/null > +++ > b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/ScriptsPlugin.java > @@ -0,0 +1,43 @@ > +/* > + * 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 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; > + > +/** > + * A container of Scripts. > + */ > +@Plugin(name = "scripts", category = "Core") > +public final class ScriptsPlugin { > + > + private ScriptsPlugin() { > + } > + > + /** > + * Return the array of scripts > + * @param scripts An array of Scripts. > + * @return The array of AbstractScripts. > + */ > + @PluginFactory > + public static AbstractScript[] createScripts(@PluginElement("Scripts") > final AbstractScript[] scripts) { > + > + return scripts; > + } > +} > > http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/8aae118a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/ScriptFilter.java > ---------------------------------------------------------------------- > 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 9e8acca..549437a 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 > @@ -33,9 +33,11 @@ import > org.apache.logging.log4j.core.config.plugins.PluginFactory; > import org.apache.logging.log4j.core.script.AbstractScript; > import org.apache.logging.log4j.core.script.Script; > import org.apache.logging.log4j.core.script.ScriptFile; > +import org.apache.logging.log4j.core.script.ScriptRef; > import org.apache.logging.log4j.message.Message; > import org.apache.logging.log4j.message.ObjectMessage; > import org.apache.logging.log4j.message.SimpleMessage; > +import org.apache.logging.log4j.status.StatusLogger; > > /** > * Returns the onMatch result if the script returns True and returns the > onMisMatch value otherwise. > @@ -44,6 +46,7 @@ import org.apache.logging.log4j.message.SimpleMessage; > public final class ScriptFilter extends AbstractFilter { > > private static final long serialVersionUID = 1L; > + private static org.apache.logging.log4j.Logger logger = > StatusLogger.getLogger(); > > private final AbstractScript script; > private final Configuration configuration; > @@ -53,7 +56,9 @@ public final class ScriptFilter extends AbstractFilter { > super(onMatch, onMismatch); > this.script = script; > this.configuration = configuration; > - configuration.getScriptManager().addScript(script); > + if (!(script instanceof ScriptRef)) { > + configuration.getScriptManager().addScript(script); > + } > } > > @Override > @@ -134,19 +139,28 @@ public final class ScriptFilter extends AbstractFilter { > public static ScriptFilter createFilter( > @PluginElement("Script") final Script script, > @PluginElement("ScriptFile") final ScriptFile scriptFile, > + @PluginElement("ScriptRef") final ScriptRef scriptRef, > @PluginAttribute("onMatch") final Result match, > @PluginAttribute("onMismatch") final Result mismatch, > @PluginConfiguration final Configuration configuration) { > > - if (script == null && scriptFile == null) { > - LOGGER.error("A Script or ScriptFile element must be provided > for this ScriptFilter"); > + if (script == null && scriptFile == null && scriptRef == null) { > + LOGGER.error("A Script, ScriptFile or ScriptRef element must be > provided for this ScriptFilter"); > return null; > } > - if (script != null && scriptFile != null) { > - LOGGER.error("One of a Script or ScriptFile element must be > provided for this ScriptFilter, but not both"); > + if ((script != null && (scriptFile != null || scriptRef != null)) || > (scriptFile != null && scriptRef != null) ) { > + LOGGER.error("Only one Script, ScriptFile or ScriptRef element > can be provided for this ScriptFilter"); > return null; > } > - return new ScriptFilter(script != null ? script : scriptFile, > configuration, match, mismatch); > + if (scriptRef != null) { > + if > (configuration.getScriptManager().getScript(scriptRef.getName()) == null) { > + logger.error("No script with name {} has been declared.", > script.getName()); > + return null; > + } > + } > + > + return new ScriptFilter(script != null ? script : scriptFile != null > ? scriptFile : scriptRef, configuration, > + match, mismatch); > } > > } > > http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/8aae118a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/ScriptPatternSelector.java > ---------------------------------------------------------------------- > 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 e9e77b2..6edb9f3 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 > @@ -28,7 +28,10 @@ import > org.apache.logging.log4j.core.config.plugins.PluginElement; > import org.apache.logging.log4j.core.config.plugins.PluginFactory; > import org.apache.logging.log4j.core.pattern.PatternFormatter; > import org.apache.logging.log4j.core.pattern.PatternParser; > +import org.apache.logging.log4j.core.script.AbstractScript; > import org.apache.logging.log4j.core.script.Script; > +import org.apache.logging.log4j.core.script.ScriptFile; > +import org.apache.logging.log4j.core.script.ScriptRef; > import org.apache.logging.log4j.status.StatusLogger; > > import javax.script.SimpleBindings; > @@ -51,16 +54,18 @@ public class ScriptPatternSelector implements > PatternSelector { > private final String defaultPattern; > > private static Logger LOGGER = StatusLogger.getLogger(); > - private final Script script; > + private final AbstractScript script; > private final Configuration configuration; > > > - public ScriptPatternSelector(final Script script, final PatternMatch[] > properties, final String defaultPattern, > + public ScriptPatternSelector(final AbstractScript script, final > PatternMatch[] properties, final String defaultPattern, > final boolean alwaysWriteExceptions, final > boolean noConsoleNoAnsi, > final Configuration config) { > this.script = script; > this.configuration = config; > - config.getScriptManager().addScript(script); > + if (!(script instanceof ScriptRef)) { > + config.getScriptManager().addScript(script); > + } > final PatternParser parser = > PatternLayout.createPatternParser(config); > for (PatternMatch property : properties) { > try { > @@ -98,23 +103,35 @@ public class ScriptPatternSelector implements > PatternSelector { > > @PluginFactory > public static ScriptPatternSelector > createSelector(@PluginElement("Script") Script script, > + > @PluginElement("ScriptFile") ScriptFile scriptFile, > + > @PluginElement("ScriptRef") ScriptRef scriptRef, > > @PluginElement("PatternMatch") final PatternMatch[] properties, > > @PluginAttribute("defaultPattern") String defaultPattern, > > @PluginAttribute(value = "alwaysWriteExceptions", defaultBoolean = true) > final boolean alwaysWriteExceptions, > > @PluginAttribute(value = "noConsoleNoAnsi", defaultBoolean = false) final > boolean noConsoleNoAnsi, > @PluginConfiguration > final Configuration config) { > - if (script == null) { > - LOGGER.error("No script provided"); > + if (script == null && scriptFile == null && scriptRef == null) { > + LOGGER.error("A Script, ScriptFile or ScriptRef element must be > provided for this ScriptFilter"); > + return null; > + } > + if ((script != null && (scriptFile != null || scriptRef != null)) || > (scriptFile != null && scriptRef != null) ) { > + LOGGER.error("Only one Script, ScriptFile or ScriptRef element > can be provided for this ScriptFilter"); > return null; > } > + if (scriptRef != null) { > + if (config.getScriptManager().getScript(script.getName()) == > null) { > + LOGGER.error("No script with name {} has been declared.", > script.getName()); > + return null; > + } > + } > if (defaultPattern == null) { > defaultPattern = PatternLayout.DEFAULT_CONVERSION_PATTERN; > } > if (properties == null || properties.length == 0) { > LOGGER.warn("No marker patterns were provided"); > } > - return new ScriptPatternSelector(script, properties, defaultPattern, > alwaysWriteExceptions, > - noConsoleNoAnsi, config); > + return new ScriptPatternSelector(script != null ? script : > scriptFile != null ? scriptFile : scriptRef, > + properties, defaultPattern, alwaysWriteExceptions, > noConsoleNoAnsi, config); > } > > @Override > > http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/8aae118a/log4j-core/src/main/java/org/apache/logging/log4j/core/script/ScriptFile.java > ---------------------------------------------------------------------- > 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 f1bf300..d4c2615 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 > @@ -48,8 +48,8 @@ public class ScriptFile extends AbstractScript { > private final boolean isWatched; > > > - public ScriptFile(Path filePath, String language, boolean isWatched, > String scriptText) { > - super(filePath.toString(), language, scriptText); > + public ScriptFile(String name, Path filePath, String language, boolean > isWatched, String scriptText) { > + super(name, language, scriptText); > this.filePath = filePath; > this.isWatched = isWatched; > } > @@ -65,6 +65,7 @@ public class ScriptFile extends AbstractScript { > @PluginFactory > public static ScriptFile createScript( > // @formatter:off > + @PluginAttribute("name") String name, > @PluginAttribute("language") String language, > @PluginAttribute("path") final String filePathOrUri, > @PluginAttribute("isWatched") final Boolean isWatched, > @@ -74,6 +75,9 @@ public class ScriptFile extends AbstractScript { > logger.error("No script path provided for ScriptFile"); > return null; > } > + if (name == null) { > + name = filePathOrUri; > + } > final URI uri = NetUtils.toURI(filePathOrUri); > final File file = FileUtils.fileFromUri(uri); > if (language == null && file != null) { > @@ -105,6 +109,6 @@ public class ScriptFile extends AbstractScript { > logger.error("Unable to convert {} to a Path", uri.toString()); > return null; > } > - return new ScriptFile(path, language, isWatched == null ? > Boolean.FALSE : isWatched, scriptText); > + return new ScriptFile(name, path, language, isWatched == null ? > Boolean.FALSE : isWatched, scriptText); > } > } > > http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/8aae118a/log4j-core/src/main/java/org/apache/logging/log4j/core/script/ScriptManager.java > ---------------------------------------------------------------------- > 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 b7b701a..9a0e998 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 > @@ -111,6 +111,11 @@ public class ScriptManager implements FileWatcher { > } > } > > + public AbstractScript getScript(final String name) { > + ScriptRunner runner = scripts.get(name); > + return runner != null ? runner.getScript() : null; > + } > + > @Override > public void fileModified(final File file) { > ScriptRunner runner = scripts.get(file.toString()); > > http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/8aae118a/log4j-core/src/main/java/org/apache/logging/log4j/core/script/ScriptRef.java > ---------------------------------------------------------------------- > 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 > new file mode 100644 > index 0000000..94075fe > --- /dev/null > +++ > b/log4j-core/src/main/java/org/apache/logging/log4j/core/script/ScriptRef.java > @@ -0,0 +1,53 @@ > +package org.apache.logging.log4j.core.script; > + > +import org.apache.logging.log4j.Logger; > +import org.apache.logging.log4j.core.config.Configuration; > +import org.apache.logging.log4j.core.config.Node; > +import org.apache.logging.log4j.core.config.plugins.Plugin; > +import org.apache.logging.log4j.core.config.plugins.PluginAttribute; > +import org.apache.logging.log4j.core.config.plugins.PluginConfiguration; > +import org.apache.logging.log4j.core.config.plugins.PluginFactory; > +import org.apache.logging.log4j.core.config.plugins.PluginValue; > +import org.apache.logging.log4j.status.StatusLogger; > + > +/** > + * Container for the language and body of a script. > + */ > +@Plugin(name = "ScriptRef", category = Node.CATEGORY, printObject = true) > +public class ScriptRef extends AbstractScript { > + > + private static final Logger logger = StatusLogger.getLogger(); > + private final ScriptManager scriptManager; > + > + public ScriptRef(String name, ScriptManager scriptManager) { > + super(name, null, null); > + this.scriptManager = scriptManager; > + } > + > + @Override > + public String getLanguage() { > + AbstractScript script = this.scriptManager.getScript(getName()); > + return script != null ? script.getLanguage() : null; > + } > + > + > + @Override > + public String getScriptText() { > + AbstractScript script = this.scriptManager.getScript(getName()); > + return script != null ? script.getScriptText() : null; > + } > + > + @PluginFactory > + public static ScriptRef createReference( > + // @formatter:off > + @PluginAttribute("ref") final String name, > + @PluginConfiguration Configuration configuration) { > + // @formatter:on > + if (name == null) { > + logger.error("No script name provided"); > + return null; > + } > + return new ScriptRef(name, configuration.getScriptManager()); > + > + } > +} > > http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/8aae118a/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/ScriptRefFilterTest.java > ---------------------------------------------------------------------- > diff --git > a/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/ScriptRefFilterTest.java > > b/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/ScriptRefFilterTest.java > new file mode 100644 > index 0000000..f95536d > --- /dev/null > +++ > b/log4j-core/src/test/java/org/apache/logging/log4j/core/filter/ScriptRefFilterTest.java > @@ -0,0 +1,37 @@ > +/* > + * 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.filter; > + > +import org.apache.logging.log4j.junit.LoggerContextRule; > +import org.junit.ClassRule; > + > +/** > + * > + */ > +public class ScriptRefFilterTest extends AbstractScriptFilterTest { > + > + private static final String CONFIG = "log4j-scriptRef-filters.xml"; > + > + @ClassRule > + public static LoggerContextRule context = new LoggerContextRule(CONFIG); > + > + @Override > + public LoggerContextRule getContext() { > + return context; > + } > + > +} > > http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/8aae118a/log4j-core/src/test/resources/log4j-scriptRef-filters.xml > ---------------------------------------------------------------------- > diff --git a/log4j-core/src/test/resources/log4j-scriptRef-filters.xml > b/log4j-core/src/test/resources/log4j-scriptRef-filters.xml > new file mode 100644 > index 0000000..1cef279 > --- /dev/null > +++ b/log4j-core/src/test/resources/log4j-scriptRef-filters.xml > @@ -0,0 +1,47 @@ > +<?xml version="1.0" encoding="UTF-8"?> > +<!-- > + ~ 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. > + --> > +<Configuration status="ERROR"> > +<Scripts> > + <ScriptFile name="filter.js" language="JavaScript" > path="src/test/resources/scripts/filter.js" charset="UTF-8" /> > + <ScriptFile name="filter.groovy" > path="src/test/resources/scripts/filter.groovy" charset="UTF-8" /> > +</Scripts> > +<Appenders> > + <List name="List"> > + <PatternLayout pattern="[%-5level] %c{1.} %msg%n"/> > + </List> > +</Appenders> > +<Loggers> > + <Logger name="TestJavaScriptFilter" level="trace" additivity="false"> > + <AppenderRef ref="List"> > + <ScriptFilter onMatch="ACCEPT" onMisMatch="DENY"> > + <ScriptRef ref="filter.js" /> > + </ScriptFilter> > + </AppenderRef> > + </Logger> > + <Logger name="TestGroovyFilter" level="trace" additivity="false"> > + <AppenderRef ref="List"> > + <ScriptFilter onMatch="ACCEPT" onMisMatch="DENY"> > + <ScriptRef ref="filter.groovy" /> > + </ScriptFilter> > + </AppenderRef> > + </Logger> > + <Root level="trace"> > + <AppenderRef ref="List" /> > + </Root> > +</Loggers> > +</Configuration> > \ No newline at end of file > > > > > -- > E-Mail: [email protected] | [email protected] > Java Persistence with Hibernate, Second Edition > JUnit in Action, Second Edition > Spring Batch in Action > Blog: http://garygregory.wordpress.com > Home: http://garygregory.com/ > Tweet! http://twitter.com/GaryGregory
