You are viewing a plain text version of this content. The canonical link for it is here.
Posted to log4j-dev@logging.apache.org by Gary Gregory <ga...@gmail.com> on 2015/10/07 10:42:24 UTC

Fwd: logging-log4j2 git commit: LOG4J2-1136 - Add Script references

Ralph,

Can you provide Javdoc on ScriptRef that explains the difference
with ScriptFile?

Gary
---------- Forwarded message ----------
From: <rg...@apache.org>
Date: Tue, Oct 6, 2015 at 11:12 PM
Subject: logging-log4j2 git commit: LOG4J2-1136 - Add Script references
To: commits@logging.apache.org


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 <rg...@nextiva.com>
Authored: Tue Oct 6 23:12:32 2015 -0700
Committer: Ralph Goers <rg...@nextiva.com>
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: garydgregory@gmail.com | ggregory@apache.org
Java Persistence with Hibernate, Second Edition
<http://www.manning.com/bauer3/>
JUnit in Action, Second Edition <http://www.manning.com/tahchiev/>
Spring Batch in Action <http://www.manning.com/templier/>
Blog: http://garygregory.wordpress.com
Home: http://garygregory.com/
Tweet! http://twitter.com/GaryGregory

Re: logging-log4j2 git commit: LOG4J2-1136 - Add Script references

Posted by Ralph Goers <ra...@dslextreme.com>.
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 <ga...@gmail.com> wrote:
> 
> Ralph,
> 
> Can you provide Javdoc on ScriptRef that explains the difference with ScriptFile? 
> 
> Gary
> ---------- Forwarded message ----------
> From: <rg...@apache.org>
> Date: Tue, Oct 6, 2015 at 11:12 PM
> Subject: logging-log4j2 git commit: LOG4J2-1136 - Add Script references
> To: commits@logging.apache.org
> 
> 
> 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 <rg...@nextiva.com>
> Authored: Tue Oct 6 23:12:32 2015 -0700
> Committer: Ralph Goers <rg...@nextiva.com>
> 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: garydgregory@gmail.com | ggregory@apache.org 
> 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