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 rg...@apache.org on 2010/10/28 09:13:55 UTC
svn commit: r1028206 - in
/logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src:
main/java/org/apache/logging/log4j/core/
main/java/org/apache/logging/log4j/core/appender/
main/java/org/apache/logging/log4j/core/config/ main/java/org/a...
Author: rgoers
Date: Thu Oct 28 07:13:55 2010
New Revision: 1028206
URL: http://svn.apache.org/viewvc?rev=1028206&view=rev
Log:
Move filters into its own object
Added:
logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/filter/Filterable.java
logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/filter/Filters.java
Removed:
logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/config/plugins/FiltersPlugin.java
Modified:
logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/Appender.java
logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/Filter.java
logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/Lifecycle.java
logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/Logger.java
logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/appender/AppenderBase.java
logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/appender/ConsoleAppender.java
logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/appender/FileAppender.java
logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/appender/ListAppender.java
logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/appender/OutputStreamAppender.java
logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControl.java
logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/config/BaseConfiguration.java
logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/config/LoggerConfig.java
logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/test/java/org/apache/logging/log4j/core/config/XMLConfigurationTest.java
logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/test/java/org/apache/logging/log4j/core/layout/PatternLayoutTest.java
Modified: logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/Appender.java
URL: http://svn.apache.org/viewvc/logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/Appender.java?rev=1028206&r1=1028205&r2=1028206&view=diff
==============================================================================
--- logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/Appender.java (original)
+++ logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/Appender.java Thu Oct 28 07:13:55 2010
@@ -23,33 +23,6 @@ import java.util.List;
*/
public interface Appender {
/**
- * Add a filter to the end of the filter list.
- *
- * @param filter The Filter to add.
- */
- void addFilter(Filter filter);
-
- /**
- * Returns the head Filter. The Filters are organized in a linked list
- * and so all Filters on this Appender are available through the result.
- *
- * @return the head Filter or null, if no Filters are present
- */
- Filter getFilter();
-
- /**
- * Clear the list of filters by removing all the filters in it.
- */
- void clearFilters();
-
- /**
- * Return the list of Filters associated with this appender.
- *
- * @return
- */
- List<Filter> getFilters();
-
- /**
* Release any resources allocated within the appender such as file
* handles, network connections, etc.
* <p/>
@@ -107,22 +80,6 @@ public interface Appender {
*/
boolean suppressException();
- /**
- * Called when the Appender is initialized.
- */
- void start();
-
- /**
- * Called when the Appender is being shut down.
- */
- void stop();
-
- /**
- * Returns true if the appender is ready to process requests.
- * @return true if the appender is ready to process requests, false otherwise.
- */
- boolean isStarted();
-
ErrorHandler getHandler();
void setHandler(ErrorHandler handler);
Modified: logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/Filter.java
URL: http://svn.apache.org/viewvc/logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/Filter.java?rev=1028206&r1=1028205&r2=1028206&view=diff
==============================================================================
--- logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/Filter.java (original)
+++ logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/Filter.java Thu Oct 28 07:13:55 2010
@@ -13,21 +13,6 @@ public interface Filter {
ACCEPT, NEUTRAL, DENY
}
- /**
- * @doubt lifecycle management should be orthogonal.
- */
- void start();
-
- /**
- * @doubt lifecycle management should be orthogonal.
- */
- void stop();
-
- /**
- * @doubt lifecycle management should be orthogonal.
- */
- boolean isStarted();
-
Result getOnMismatch();
Result getOnMatch();
Modified: logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/Lifecycle.java
URL: http://svn.apache.org/viewvc/logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/Lifecycle.java?rev=1028206&r1=1028205&r2=1028206&view=diff
==============================================================================
--- logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/Lifecycle.java (original)
+++ logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/Lifecycle.java Thu Oct 28 07:13:55 2010
@@ -7,4 +7,6 @@ public interface Lifecycle {
void start();
void stop();
+
+ boolean isStarted();
}
Modified: logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/Logger.java
URL: http://svn.apache.org/viewvc/logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/Logger.java?rev=1028206&r1=1028205&r2=1028206&view=diff
==============================================================================
--- logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/Logger.java (original)
+++ logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/Logger.java Thu Oct 28 07:13:55 2010
@@ -29,12 +29,12 @@ import java.util.Map;
/**
* @doubt All the isEnabled methods could be pushed into a filter interface. Not sure of the utility of having
- * isEnabled be able to examine the message pattern and parameters. (RG) Will look into whether adding an
- * interface for the isEnabled methods provides any value. The isEnabled methods are required so that Filters
- * (besides the standard log level check) can participate in the decision.
+ * isEnabled be able to examine the message pattern and parameters. (RG) Moving the isEnabled methods out of
+ * Logger noticeably impacts performance. The message pattern and parameters are required so that they can be
+ * used in global filters.
*/
public class Logger extends AbstractLogger {
- //private static String FQCN = Logger.class.getName();
+
private final String name;
private final LoggerContext context;
@@ -141,10 +141,14 @@ public class Logger extends AbstractLogg
return config.loggerConfig.getAppenders();
}
- public List<Filter> getFilters() {
+ public Iterator<Filter> getFilters() {
return config.loggerConfig.getFilters();
}
+ public int filterCount() {
+ return config.loggerConfig.filterCount();
+ }
+
public void addFilter(Filter filter) {
config.config.addLoggerFilter(this, filter);
}
Modified: logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/appender/AppenderBase.java
URL: http://svn.apache.org/viewvc/logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/appender/AppenderBase.java?rev=1028206&r1=1028205&r2=1028206&view=diff
==============================================================================
--- logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/appender/AppenderBase.java (original)
+++ logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/appender/AppenderBase.java Thu Oct 28 07:13:55 2010
@@ -23,6 +23,8 @@ import org.apache.logging.log4j.core.con
import org.apache.logging.log4j.core.Filter;
import org.apache.logging.log4j.core.Layout;
import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.core.filter.Filterable;
+import org.apache.logging.log4j.core.filter.Filters;
import org.apache.logging.log4j.internal.StatusLogger;
import org.apache.logging.log4j.Logger;
@@ -32,7 +34,7 @@ import java.util.concurrent.CopyOnWriteA
/**
* @doubt Appender should be refactored as mentioned elsewhere
*/
-public abstract class AppenderBase implements Appender, Lifecycle {
+public abstract class AppenderBase extends Filterable implements Appender, Lifecycle {
/**
* Appenders set this by calling super.start().
@@ -41,8 +43,6 @@ public abstract class AppenderBase imple
private Layout layout = null;
- private List<Filter> filters = new CopyOnWriteArrayList<Filter>();
-
private final String name;
private final boolean errors = false;
@@ -56,12 +56,10 @@ public abstract class AppenderBase imple
public static final String NAME = "name";
- public AppenderBase(String name, Filter[] filters, Layout layout) {
+ public AppenderBase(String name, Filters filters, Layout layout) {
this.name = name;
this.layout = layout;
- if (filters != null) {
- this.filters = new CopyOnWriteArrayList<Filter>(filters);
- }
+ setFilters(filters);
}
public ErrorHandler getHandler() {
@@ -82,26 +80,6 @@ public abstract class AppenderBase imple
this.handler = handler;
}
-
- /**
- * @doubt would be better to atomically replace a single Filter (which could be composite)
- */
- public void addFilter(Filter filter) {
- filters.add(filter);
- }
-
- public Filter getFilter() {
- return filters.size() > 0 ? filters.get(0) : null;
- }
-
- public void clearFilters() {
- filters.clear();
- }
-
- public List<Filter> getFilters() {
- return filters;
- }
-
public void close() {
}
@@ -150,17 +128,13 @@ public abstract class AppenderBase imple
logger.error("A layout is required and none was provided");
return;
}
- for (Filter filter : filters) {
- filter.start();
- }
+ startFilters();
this.started = true;
}
public void stop() {
this.started = false;
- for (Filter filter : filters) {
- filter.stop();
- }
+ stopFilters();
}
public boolean isStarted() {
Modified: logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/appender/ConsoleAppender.java
URL: http://svn.apache.org/viewvc/logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/appender/ConsoleAppender.java?rev=1028206&r1=1028205&r2=1028206&view=diff
==============================================================================
--- logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/appender/ConsoleAppender.java (original)
+++ logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/appender/ConsoleAppender.java Thu Oct 28 07:13:55 2010
@@ -22,6 +22,7 @@ import org.apache.logging.log4j.core.con
import org.apache.logging.log4j.core.config.plugins.PluginAttr;
import org.apache.logging.log4j.core.config.plugins.PluginElement;
import org.apache.logging.log4j.core.config.plugins.PluginFactory;
+import org.apache.logging.log4j.core.filter.Filters;
/**
* ConsoleAppender appends log events to <code>System.out</code> or
@@ -49,13 +50,13 @@ public class ConsoleAppender extends Out
}
- public ConsoleAppender(String name, Layout layout, Filter[] filters, Target target) {
+ public ConsoleAppender(String name, Layout layout, Filters filters, Target target) {
super(name, layout, filters, target == Target.SYSTEM_OUT ? System.out : System.err);
}
@PluginFactory
public static ConsoleAppender createAppender(@PluginElement("layout") Layout layout,
- @PluginElement("filters") Filter[] filters,
+ @PluginElement("filters") Filters filters,
@PluginAttr("target") String t,
@PluginAttr("name") String name) {
if (name == null) {
Modified: logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/appender/FileAppender.java
URL: http://svn.apache.org/viewvc/logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/appender/FileAppender.java?rev=1028206&r1=1028205&r2=1028206&view=diff
==============================================================================
--- logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/appender/FileAppender.java (original)
+++ logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/appender/FileAppender.java Thu Oct 28 07:13:55 2010
@@ -22,6 +22,7 @@ import org.apache.logging.log4j.core.con
import org.apache.logging.log4j.core.config.plugins.PluginAttr;
import org.apache.logging.log4j.core.config.plugins.PluginElement;
import org.apache.logging.log4j.core.config.plugins.PluginFactory;
+import org.apache.logging.log4j.core.filter.Filters;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
@@ -37,7 +38,7 @@ public class FileAppender extends Output
public static final String APPEND = "append";
public final String fileName;
- public FileAppender(String name, Layout layout, Filter[] filters, OutputStream os, String filename) {
+ public FileAppender(String name, Layout layout, Filters filters, OutputStream os, String filename) {
super(name, layout, filters, os);
this.fileName = filename;
}
@@ -47,7 +48,7 @@ public class FileAppender extends Output
@PluginAttr("append") String append,
@PluginAttr("name") String name,
@PluginElement("layout") Layout layout,
- @PluginElement("filters") Filter[] filters) {
+ @PluginElement("filters") Filters filters) {
boolean isAppend = append == null ? true : Boolean.valueOf(append);
Modified: logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/appender/ListAppender.java
URL: http://svn.apache.org/viewvc/logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/appender/ListAppender.java?rev=1028206&r1=1028205&r2=1028206&view=diff
==============================================================================
--- logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/appender/ListAppender.java (original)
+++ logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/appender/ListAppender.java Thu Oct 28 07:13:55 2010
@@ -22,6 +22,7 @@ import org.apache.logging.log4j.core.con
import org.apache.logging.log4j.core.config.plugins.PluginAttr;
import org.apache.logging.log4j.core.config.plugins.PluginElement;
import org.apache.logging.log4j.core.config.plugins.PluginFactory;
+import org.apache.logging.log4j.core.filter.Filters;
import java.util.ArrayList;
import java.util.Collections;
@@ -40,7 +41,7 @@ public class ListAppender extends Append
super(name, null, null);
}
- public ListAppender(String name, Filter[] filters) {
+ public ListAppender(String name, Filters filters) {
super(name, filters, null);
}
@@ -58,7 +59,7 @@ public class ListAppender extends Append
@PluginFactory
public static ListAppender createAppender(@PluginAttr("name") String name,
- @PluginElement("filters") Filter[] filters) {
+ @PluginElement("filters") Filters filters) {
if (name == null) {
logger.error("No name provided for ListAppender");
Modified: logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/appender/OutputStreamAppender.java
URL: http://svn.apache.org/viewvc/logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/appender/OutputStreamAppender.java?rev=1028206&r1=1028205&r2=1028206&view=diff
==============================================================================
--- logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/appender/OutputStreamAppender.java (original)
+++ logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/appender/OutputStreamAppender.java Thu Oct 28 07:13:55 2010
@@ -20,6 +20,7 @@ import org.apache.logging.log4j.core.Err
import org.apache.logging.log4j.core.Filter;
import org.apache.logging.log4j.core.Layout;
import org.apache.logging.log4j.core.LogEvent;
+import org.apache.logging.log4j.core.filter.Filters;
import java.io.IOException;
import java.io.OutputStream;
@@ -56,7 +57,7 @@ public abstract class OutputStreamAppend
* @param layout The layout to format the message.
* @param os The OutputStream.
*/
- public OutputStreamAppender(String name, Layout layout, Filter[] filters, OutputStream os) {
+ public OutputStreamAppender(String name, Layout layout, Filters filters, OutputStream os) {
super(name, filters, layout);
this.setOutputStream(os);
}
Modified: logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControl.java
URL: http://svn.apache.org/viewvc/logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControl.java?rev=1028206&r1=1028205&r2=1028206&view=diff
==============================================================================
--- logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControl.java (original)
+++ logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControl.java Thu Oct 28 07:13:55 2010
@@ -19,9 +19,13 @@ package org.apache.logging.log4j.core.co
import org.apache.logging.log4j.core.ErrorHandler;
import org.apache.logging.log4j.core.Appender;
import org.apache.logging.log4j.core.Filter;
+import org.apache.logging.log4j.core.Lifecycle;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.appender.AppenderRuntimeException;
import org.apache.logging.log4j.core.appender.DefaultErrorHandler;
+import org.apache.logging.log4j.core.filter.Filterable;
+
+import java.util.Iterator;
/**
* Wraps appenders with details the appender implementation shouldn't need to know about.
@@ -48,20 +52,24 @@ public class AppenderControl {
try {
recursive.set(this);
- if (!appender.isStarted()) {
- appender.getHandler().error("Attempted to append to non-started appender " + appender.getName());
-
- if (!appender.suppressException()) {
- throw new AppenderRuntimeException("Attempted to append to non-started appender " + appender.getName());
+ if (appender instanceof Lifecycle) {
+ if (!((Lifecycle)appender).isStarted()) {
+ appender.getHandler().error("Attempted to append to non-started appender " + appender.getName());
+
+ if (!appender.suppressException()) {
+ throw new AppenderRuntimeException("Attempted to append to non-started appender " + appender.getName());
+ }
}
}
Filter.Result result = Filter.Result.NEUTRAL;
-
- for (Filter filter : appender.getFilters()) {
- result = filter.filter(event);
- if (result != Filter.Result.NEUTRAL) {
- break;
+ if (appender instanceof Filterable) {
+ Iterator<Filter> iter = ((Filterable)appender).getFilters();
+ while (iter.hasNext()) {
+ result = iter.next().filter(event);
+ if (result != Filter.Result.NEUTRAL) {
+ break;
+ }
}
}
if (result == Filter.Result.DENY) {
Modified: logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/config/BaseConfiguration.java
URL: http://svn.apache.org/viewvc/logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/config/BaseConfiguration.java?rev=1028206&r1=1028205&r2=1028206&view=diff
==============================================================================
--- logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/config/BaseConfiguration.java (original)
+++ logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/config/BaseConfiguration.java Thu Oct 28 07:13:55 2010
@@ -19,12 +19,15 @@ package org.apache.logging.log4j.core.co
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.Appender;
import org.apache.logging.log4j.core.Filter;
+import org.apache.logging.log4j.core.Lifecycle;
import org.apache.logging.log4j.core.config.plugins.PluginAttr;
import org.apache.logging.log4j.core.config.plugins.PluginFactory;
import org.apache.logging.log4j.core.config.plugins.PluginManager;
import org.apache.logging.log4j.core.config.plugins.PluginElement;
import org.apache.logging.log4j.core.config.plugins.PluginType;
import org.apache.logging.log4j.core.config.plugins.PluginValue;
+import org.apache.logging.log4j.core.filter.Filterable;
+import org.apache.logging.log4j.core.filter.Filters;
import org.apache.logging.log4j.core.helpers.NameUtil;
import org.apache.logging.log4j.core.lookup.Interpolator;
import org.apache.logging.log4j.core.lookup.MapLookup;
@@ -43,11 +46,12 @@ import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.concurrent.atomic.AtomicReference;
/**
*
*/
-public class BaseConfiguration implements Configuration {
+public class BaseConfiguration extends Filterable implements Configuration {
private String name;
@@ -59,10 +63,6 @@ public class BaseConfiguration implement
private LoggerConfig root = new LoggerConfig();
- private List<Filter> filters = new CopyOnWriteArrayList<Filter>();
-
- private boolean hasFilters = false;
-
private boolean started = false;
protected Node rootNode;
@@ -81,12 +81,11 @@ public class BaseConfiguration implement
setup();
doConfigure();
for (Appender appender : appenders.values()) {
- appender.start();
+ if (appender instanceof Lifecycle)
+ ((Lifecycle)appender).start();
}
- for (Filter filter : filters) {
- filter.start();
- }
+ startFilters();
}
public void stop() {
@@ -94,11 +93,11 @@ public class BaseConfiguration implement
logger.clearAppenders();
}
for (Appender appender : appenders.values()) {
- appender.stop();
- }
- for (Filter filter : filters) {
- filter.stop();
+ if (appender instanceof Lifecycle) {
+ ((Lifecycle)appender).stop();
+ }
}
+ stopFilters();
}
protected void setup() {
@@ -115,7 +114,7 @@ public class BaseConfiguration implement
} else if (child.getName().equals("appenders")) {
appenders = (ConcurrentMap<String, Appender>) child.getObject();
} else if (child.getName().equals("filters")) {
- filters = new CopyOnWriteArrayList((Filter[]) child.getObject());
+ setFilters((Filters) child.getObject());
} else if (child.getName().equals("loggers")) {
Loggers l = (Loggers) child.getObject();
loggers = l.getMap();
@@ -212,8 +211,8 @@ public class BaseConfiguration implement
}
Appender app = appenders.remove(name);
- if (app != null) {
- app.stop();
+ if (app != null && app instanceof Lifecycle) {
+ ((Lifecycle)app).stop();
}
}
@@ -275,24 +274,6 @@ public class BaseConfiguration implement
loggers.remove(name);
}
- public Iterator<Filter> getFilters() {
- return filters.iterator();
- }
-
- public void addFilter(Filter filter) {
- filters.add(filter);
- hasFilters = filters.size() > 0;
- }
-
- public void removeFilter(Filter filter) {
- filters.remove(filter);
- hasFilters = filters.size() > 0;
- }
-
- public boolean hasFilters() {
- return hasFilters;
- }
-
private void createConfiguration(Node node) {
for (Node child : node.getChildren()) {
createConfiguration(child);
@@ -405,8 +386,8 @@ public class BaseConfiguration implement
} else if (a instanceof PluginElement) {
PluginElement elem = (PluginElement)a;
String name = elem.value();
- Class parmClass = parmClasses[index].getComponentType();
if (parmClasses[index].isArray()) {
+ Class parmClass = parmClasses[index].getComponentType();
List<Object> list = new ArrayList<Object>();
sb.append("{");
boolean first = true;
@@ -441,6 +422,7 @@ public class BaseConfiguration implement
}
parms[index] = array;
} else {
+ Class parmClass = parmClasses[index];
for (Node child : children) {
sb.append(child.toString());
PluginType childType = child.getType();
Modified: logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/config/LoggerConfig.java
URL: http://svn.apache.org/viewvc/logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/config/LoggerConfig.java?rev=1028206&r1=1028205&r2=1028206&view=diff
==============================================================================
--- logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/config/LoggerConfig.java (original)
+++ logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/config/LoggerConfig.java Thu Oct 28 07:13:55 2010
@@ -28,6 +28,8 @@ import org.apache.logging.log4j.core.con
import org.apache.logging.log4j.core.config.plugins.PluginAttr;
import org.apache.logging.log4j.core.config.plugins.PluginFactory;
import org.apache.logging.log4j.core.config.plugins.PluginElement;
+import org.apache.logging.log4j.core.filter.Filterable;
+import org.apache.logging.log4j.core.filter.Filters;
import org.apache.logging.log4j.internal.StatusLogger;
import org.apache.logging.log4j.message.Message;
@@ -39,19 +41,17 @@ import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.concurrent.atomic.AtomicReference;
/**
*
*/
@Plugin(name="logger",type="Core")
-public class LoggerConfig implements LogEventFactory {
+public class LoggerConfig extends Filterable implements LogEventFactory {
private List<String> appenderRefs = new ArrayList<String>();
private Map<String, AppenderControl> appenders = new ConcurrentHashMap<String, AppenderControl>();
- private List<Filter> filters = new CopyOnWriteArrayList<Filter>();
- private boolean hasFilters = false;
-
private final String name;
private LogEventFactory logEventFactory;
@@ -77,15 +77,12 @@ public class LoggerConfig implements Log
this.additive = additive;
}
- protected LoggerConfig(String name, List<String> appenders, Filter[] filters, Level level,
+ protected LoggerConfig(String name, List<String> appenders, Filters filters, Level level,
boolean additive) {
this.logEventFactory = this;
this.name = name;
this.appenderRefs = appenders;
- if (filters != null && filters.length > 0) {
- this.filters = new CopyOnWriteArrayList<Filter>(filters);
- hasFilters = true;
- }
+ setFilters(filters);
this.level = level;
this.additive = additive;
}
@@ -142,20 +139,6 @@ public class LoggerConfig implements Log
this.logEventFactory = logEventFactory;
}
- public void addFilter(Filter filter) {
- filters.add(filter);
- hasFilters = filters.size() > 0;
- }
-
- public void removeFilter(Filter filter) {
- filters.remove(filter);
- hasFilters = filters.size() > 0;
- }
-
- public List<Filter> getFilters() {
- return Collections.unmodifiableList(filters);
- }
-
public boolean isAdditive() {
return additive;
}
@@ -170,12 +153,8 @@ public class LoggerConfig implements Log
}
private void log(LogEvent event) {
- if (hasFilters) {
- for (Filter filter : filters) {
- if (filter.filter(event) == Filter.Result.DENY) {
- return;
- }
- }
+ if (isFiltered(event)) {
+ return;
}
callAppenders(event);
@@ -201,7 +180,7 @@ public class LoggerConfig implements Log
@PluginAttr("level") String loggerLevel,
@PluginAttr("name") String loggerName,
@PluginElement("appender-ref") String[] refs,
- @PluginElement("filters") Filter[] filters) {
+ @PluginElement("filters") Filters filters) {
if (loggerName == null) {
logger.error("Loggers cannot be configured without a name");
return null;
@@ -222,7 +201,7 @@ public class LoggerConfig implements Log
public static LoggerConfig createLogger(@PluginAttr("additivity") String additivity,
@PluginAttr("level") String loggerLevel,
@PluginElement("appender-ref") String[] refs,
- @PluginElement("filters") Filter[] filters) {
+ @PluginElement("filters") Filters filters) {
List<String> appenderRefs = Arrays.asList(refs);
Level level = loggerLevel == null ? Level.ERROR : Level.valueOf(loggerLevel.toUpperCase());
boolean additive = additivity == null ? true : Boolean.parseBoolean(additivity);
Added: logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/filter/Filterable.java
URL: http://svn.apache.org/viewvc/logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/filter/Filterable.java?rev=1028206&view=auto
==============================================================================
--- logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/filter/Filterable.java (added)
+++ logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/filter/Filterable.java Thu Oct 28 07:13:55 2010
@@ -0,0 +1,91 @@
+/*
+ * 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.core.Filter;
+import org.apache.logging.log4j.core.Lifecycle;
+import org.apache.logging.log4j.core.LogEvent;
+
+import java.util.Iterator;
+
+/**
+ *
+ */
+public class Filterable {
+ private volatile Filters filters = new Filters(null);
+ private boolean hasFilters;
+
+ public synchronized void addFilter(Filter filter) {
+ filters = Filters.addFilter(filters, filter);
+ hasFilters = filters.hasFilters();
+ }
+
+ public synchronized void removeFilter(Filter filter) {
+ filters = Filters.removeFilter(filters, filter);
+ hasFilters = filters.hasFilters();
+ }
+
+ public synchronized void clearFilters() {
+ filters = new Filters(null);
+ hasFilters = false;
+ }
+
+ public Iterator<Filter> getFilters() {
+ return filters.iterator();
+ }
+
+ public boolean hasFilters() {
+ return hasFilters;
+ }
+
+ public int filterCount() {
+ return filters.size();
+ }
+
+ protected void startFilters() {
+ for (Filter filter : filters) {
+ if ((filter instanceof Lifecycle)) {
+ ((Lifecycle)filter).start();
+ }
+ }
+ }
+
+ protected void stopFilters() {
+ for (Filter filter : filters) {
+ if ((filter instanceof Lifecycle)) {
+ ((Lifecycle)filter).stop();
+ }
+ }
+ }
+
+ protected synchronized void setFilters(Filters newFilters) {
+ filters = newFilters == null ? new Filters(null) : newFilters;
+ hasFilters = filters.hasFilters();
+ }
+
+ protected boolean isFiltered(LogEvent event) {
+ if (hasFilters) {
+ for (Filter filter : filters) {
+ if (filter.filter(event) == Filter.Result.DENY) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+}
Added: logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/filter/Filters.java
URL: http://svn.apache.org/viewvc/logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/filter/Filters.java?rev=1028206&view=auto
==============================================================================
--- logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/filter/Filters.java (added)
+++ logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/filter/Filters.java Thu Oct 28 07:13:55 2010
@@ -0,0 +1,103 @@
+/*
+ * 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.core.Filter;
+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 java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ *
+ */
+@Plugin(name="filters", type="Core", printObject=true)
+public class Filters implements Iterable<Filter> {
+
+ private final List<Filter> filters;
+ private final boolean hasFilters;
+
+ public Filters(Filter[] filters) {
+ this.filters = filters == null || filters.length == 0 ? new ArrayList<Filter>() : Arrays.asList(filters);
+ hasFilters = filters != null && filters.length > 0;
+ }
+
+ private Filters(List<Filter> filters) {
+ if (filters == null) {
+ this.filters = new ArrayList<Filter>();
+ this.hasFilters = false;
+ return;
+ }
+ this.filters = new ArrayList<Filter>(filters);
+ this.hasFilters = this.filters.size() > 0;
+ }
+
+ public static Filters addFilter(Filters f, Filter filter) {
+ Filters newFilters = new Filters(f.filters);
+ newFilters.filters.add(filter);
+ return newFilters;
+ }
+
+ public static Filters removeFilter(Filters f, Filter filter) {
+ Filters newFilters = new Filters(f.filters);
+ newFilters.filters.remove(filter);
+ return newFilters;
+ }
+
+ public Iterator<Filter> iterator() {
+ return filters.iterator();
+ }
+
+ public List<Filter> getFilters() {
+ return Collections.unmodifiableList(filters);
+ }
+
+ public boolean hasFilters() {
+ return hasFilters;
+ }
+
+ public int size() {
+ return filters.size();
+ }
+
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ for (Filter filter : filters) {
+ if (sb.length() == 0) {
+ sb.append("{");
+ } else {
+ sb.append(", ");
+ }
+ sb.append(filter.toString());
+ }
+ if (sb.length() > 0) {
+ sb.append("}");
+ }
+ return sb.toString();
+ }
+
+ @PluginFactory
+ public static Filters createFilters(@PluginElement("filters") Filter[] filters) {
+ return new Filters(filters);
+ }
+
+}
Modified: logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/test/java/org/apache/logging/log4j/core/config/XMLConfigurationTest.java
URL: http://svn.apache.org/viewvc/logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/test/java/org/apache/logging/log4j/core/config/XMLConfigurationTest.java?rev=1028206&r1=1028205&r2=1028206&view=diff
==============================================================================
--- logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/test/java/org/apache/logging/log4j/core/config/XMLConfigurationTest.java (original)
+++ logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/test/java/org/apache/logging/log4j/core/config/XMLConfigurationTest.java Thu Oct 28 07:13:55 2010
@@ -29,6 +29,7 @@ import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
+import java.util.Iterator;
import java.util.List;
import java.util.Map;
@@ -72,9 +73,10 @@ public class XMLConfigurationTest {
assertTrue(logger instanceof org.apache.logging.log4j.core.Logger);
org.apache.logging.log4j.core.Logger l = (org.apache.logging.log4j.core.Logger) logger;
assertEquals(Level.DEBUG, l.getLevel());
- List<Filter> filters = l.getFilters();
- assertTrue("number of filters - " + filters.size(), filters.size() == 1);
- Filter filter = filters.get(0);
+ int filterCount = l.filterCount();
+ assertTrue("number of filters - " + filterCount, filterCount == 1);
+ Iterator<Filter> iter = l.getFilters();
+ Filter filter = iter.next();
assertTrue(filter instanceof MDCFilter);
Map<String, Appender> appenders = l.getAppenders();
assertNotNull(appenders);
Modified: logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/test/java/org/apache/logging/log4j/core/layout/PatternLayoutTest.java
URL: http://svn.apache.org/viewvc/logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/test/java/org/apache/logging/log4j/core/layout/PatternLayoutTest.java?rev=1028206&r1=1028205&r2=1028206&view=diff
==============================================================================
--- logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/test/java/org/apache/logging/log4j/core/layout/PatternLayoutTest.java (original)
+++ logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/test/java/org/apache/logging/log4j/core/layout/PatternLayoutTest.java Thu Oct 28 07:13:55 2010
@@ -20,6 +20,7 @@ import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.ThreadContext;
import org.apache.logging.log4j.core.Appender;
+import org.apache.logging.log4j.core.Lifecycle;
import org.apache.logging.log4j.core.Logger;
import org.apache.logging.log4j.core.LoggerContext;
import org.apache.logging.log4j.core.BasicConfigurationFactory;
@@ -74,7 +75,7 @@ public class PatternLayoutTest {
// set up appender
PatternLayout layout = new PatternLayout(msgPattern);
FileOutputStream fos = new FileOutputStream(OUTPUT_FILE + "_mdc");
- Appender appender = new FileAppender("File", layout, null, fos, OUTPUT_FILE + "_mdc");
+ FileAppender appender = new FileAppender("File", layout, null, fos, OUTPUT_FILE + "_mdc");
appender.start();
// set appender on root and set level to debug
---------------------------------------------------------------------
To unsubscribe, e-mail: log4j-dev-unsubscribe@logging.apache.org
For additional commands, e-mail: log4j-dev-help@logging.apache.org