You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by mi...@apache.org on 2017/11/20 20:34:26 UTC

[1/4] logging-chainsaw git commit: Try to upgrade to Log4j 2

Repository: logging-chainsaw
Updated Branches:
  refs/heads/log4j-2 [created] deb3b3c04


http://git-wip-us.apache.org/repos/asf/logging-chainsaw/blob/deb3b3c0/src/main/java/org/apache/log4j/spi/RendererSupport.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/log4j/spi/RendererSupport.java b/src/main/java/org/apache/log4j/spi/RendererSupport.java
new file mode 100644
index 0000000..9d69faa
--- /dev/null
+++ b/src/main/java/org/apache/log4j/spi/RendererSupport.java
@@ -0,0 +1,33 @@
+/*
+ * 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.log4j.spi;
+
+import org.apache.log4j.or.ObjectRenderer;
+import org.apache.log4j.or.RendererMap;
+
+
+public interface RendererSupport {
+
+  public
+  RendererMap getRendererMap();
+
+  public
+  void setRenderer(Class renderedClass, ObjectRenderer renderer);
+
+}

http://git-wip-us.apache.org/repos/asf/logging-chainsaw/blob/deb3b3c0/src/main/java/org/apache/log4j/spi/Thresholdable.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/log4j/spi/Thresholdable.java b/src/main/java/org/apache/log4j/spi/Thresholdable.java
index 222345f..b85bfb2 100644
--- a/src/main/java/org/apache/log4j/spi/Thresholdable.java
+++ b/src/main/java/org/apache/log4j/spi/Thresholdable.java
@@ -17,7 +17,7 @@
 
 package org.apache.log4j.spi;
 
-import org.apache.log4j.Level;
+import org.apache.logging.log4j.Level;
 
 /**
  * An interface that defines the required methods for supporting the
@@ -32,7 +32,7 @@ import org.apache.log4j.Level;
  */
 public interface Thresholdable {
     /**
-     * Sets the component theshold to the given level.
+     * Sets the component threshold to the given level.
      *
      * @param level The threshold level events must equal or be greater
      *              than before further processing can be done.

http://git-wip-us.apache.org/repos/asf/logging-chainsaw/blob/deb3b3c0/src/main/java/org/apache/log4j/varia/ListModelAppender.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/log4j/varia/ListModelAppender.java b/src/main/java/org/apache/log4j/varia/ListModelAppender.java
index ccbc9be..55bea90 100644
--- a/src/main/java/org/apache/log4j/varia/ListModelAppender.java
+++ b/src/main/java/org/apache/log4j/varia/ListModelAppender.java
@@ -17,8 +17,8 @@
 
 package org.apache.log4j.varia;
 
-import org.apache.log4j.AppenderSkeleton;
-import org.apache.log4j.spi.LoggingEvent;
+import org.apache.logging.log4j.core.LogEvent;
+import org.apache.logging.log4j.core.appender.AbstractAppender;
 
 import javax.swing.DefaultListModel;
 import javax.swing.ListModel;
@@ -32,17 +32,17 @@ import javax.swing.ListModel;
  * @author Paul Smith (psmith@apache.org)
  *
  */
-public final class ListModelAppender extends AppenderSkeleton {
+public final class ListModelAppender extends AbstractAppender {
     /**
      * Default list model.
      */
-  private final DefaultListModel model = new DefaultListModel();
+  private final DefaultListModel<LogEvent> model = new DefaultListModel<>();
 
   /**
    * Constructs a ListModelAppender.
    */
   public ListModelAppender() {
-      super(true);
+    super("ListModelAppender", null, null);
   }
   /**
    * Returns a reference to the ListModel that contains all the LoggingEvents
@@ -54,13 +54,11 @@ public final class ListModelAppender extends AppenderSkeleton {
     return model;
   }
 
-    /** {@inheritDoc} */
-  protected void append(final LoggingEvent event) {
+  public void append(final LogEvent event) {
     model.addElement(event);
   }
 
-    /** {@inheritDoc} */
-  public void close() {
+  public void stop() {
     clearModel();
   }
 
@@ -71,9 +69,4 @@ public final class ListModelAppender extends AppenderSkeleton {
     model.clear();
   }
 
-    /** {@inheritDoc} */
-  public boolean requiresLayout() {
-      return false;
-  }
-
 }

http://git-wip-us.apache.org/repos/asf/logging-chainsaw/blob/deb3b3c0/src/main/java/org/apache/log4j/xml/SAXErrorHandler.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/log4j/xml/SAXErrorHandler.java b/src/main/java/org/apache/log4j/xml/SAXErrorHandler.java
new file mode 100644
index 0000000..bd96582
--- /dev/null
+++ b/src/main/java/org/apache/log4j/xml/SAXErrorHandler.java
@@ -0,0 +1,48 @@
+/*
+ * 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.log4j.xml;
+
+import org.apache.logging.log4j.status.StatusLogger;
+import org.xml.sax.ErrorHandler;
+import org.xml.sax.SAXParseException;
+
+public class SAXErrorHandler implements ErrorHandler {
+
+  private final StatusLogger statusLogger = StatusLogger.getLogger();
+
+  public
+  void error(final SAXParseException ex) {
+    emitMessage("Continuable parsing error ", ex);
+  }
+  
+  public
+  void fatalError(final SAXParseException ex) {
+    emitMessage("Fatal parsing error ", ex);
+  }
+   
+  public
+  void warning(final SAXParseException ex) {
+    emitMessage("Parsing warning ", ex);
+  }
+  
+  private void emitMessage(final String msg, final SAXParseException ex) {
+    statusLogger.warn(msg +ex.getLineNumber()+" and column "
+		 +ex.getColumnNumber());
+    statusLogger.warn(ex.getMessage(), ex.getException());
+  }
+}

http://git-wip-us.apache.org/repos/asf/logging-chainsaw/blob/deb3b3c0/src/main/java/org/apache/log4j/xml/UtilLoggingXMLDecoder.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/log4j/xml/UtilLoggingXMLDecoder.java b/src/main/java/org/apache/log4j/xml/UtilLoggingXMLDecoder.java
index f9d8125..cba9295 100644
--- a/src/main/java/org/apache/log4j/xml/UtilLoggingXMLDecoder.java
+++ b/src/main/java/org/apache/log4j/xml/UtilLoggingXMLDecoder.java
@@ -37,13 +37,11 @@ import javax.xml.parsers.DocumentBuilder;
 import javax.xml.parsers.DocumentBuilderFactory;
 import javax.xml.parsers.ParserConfigurationException;
 
-import org.apache.log4j.Level;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.Logger;
 import org.apache.log4j.helpers.UtilLoggingLevel;
 import org.apache.log4j.spi.Decoder;
-import org.apache.log4j.spi.LoggingEvent;
-import org.apache.log4j.spi.ThrowableInformation;
-import org.apache.log4j.spi.LocationInfo;
+import org.apache.logging.log4j.core.LogEvent;
 import org.w3c.dom.Document;
 import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
@@ -77,7 +75,7 @@ public class UtilLoggingXMLDecoder implements Decoder {
     /**
      * Additional properties.
      */
-  private Map additionalProperties = new HashMap();
+  private Map<String, String> additionalProperties = new HashMap<>();
     /**
      * Partial event.
      */
@@ -120,17 +118,17 @@ public class UtilLoggingXMLDecoder implements Decoder {
 
   /**
    * Sets an additionalProperty map, where each Key/Value pair is
-   * automatically added to each LoggingEvent as it is decoded.
+   * automatically added to each LogEvent as it is decoded.
    *
    * This is useful, say, to include the source file name of the Logging events
    * @param properties additional properties
    */
-  public void setAdditionalProperties(final Map properties) {
+  public void setAdditionalProperties(final Map<String, String> properties) {
     this.additionalProperties = properties;
   }
 
   /**
-   * Converts the LoggingEvent data in XML string format into an actual
+   * Converts the LogEvent data in XML string format into an actual
    * XML Document class instance.
    * @param data XML fragment
    * @return  dom document
@@ -180,7 +178,7 @@ public class UtilLoggingXMLDecoder implements Decoder {
    * @return Vector of LoggingEvents
    * @throws IOException if IO error during processing.
    */
-  public Vector decode(final URL url) throws IOException {
+  public Vector<LogEvent> decode(final URL url) throws IOException {
     LineNumberReader reader;
     boolean isZipFile = url.getPath().toLowerCase().endsWith(".zip");
     InputStream inputStream;
@@ -199,10 +197,10 @@ public class UtilLoggingXMLDecoder implements Decoder {
     } else {
         reader = new LineNumberReader(new InputStreamReader(inputStream, ENCODING));
     }
-    Vector v = new Vector();
+    Vector<LogEvent> v = new Vector<>();
 
       String line;
-      Vector events;
+      Vector<LogEvent> events;
       try {
           while ((line = reader.readLine()) != null) {
               StringBuffer buffer = new StringBuffer(line);
@@ -233,7 +231,7 @@ public class UtilLoggingXMLDecoder implements Decoder {
    * @param document to decode events from
    * @return Vector of LoggingEvents
    */
-  public Vector decodeEvents(final String document) {
+  public Vector<LogEvent> decodeEvents(final String document) {
 
       if (document != null) {
 
@@ -279,22 +277,22 @@ public class UtilLoggingXMLDecoder implements Decoder {
 
     /**
       * Converts the string data into an XML Document, and then soaks out the
-      * relevant bits to form a new LoggingEvent instance which can be used
+      * relevant bits to form a new LogEvent instance which can be used
       * by any Log4j element locally.
       * @param data XML fragment
-      * @return a single LoggingEvent or null
+      * @return a single LogEvent or null
       */
-  public LoggingEvent decode(final String data) {
+  public LogEvent decode(final String data) {
     Document document = parse(data);
 
     if (document == null) {
       return null;
     }
 
-    Vector events = decodeEvents(document);
+    Vector<LogEvent> events = decodeEvents(document);
 
     if (events.size() > 0) {
-      return (LoggingEvent) events.firstElement();
+      return events.firstElement();
     }
 
     return null;
@@ -305,8 +303,8 @@ public class UtilLoggingXMLDecoder implements Decoder {
    * @param document XML document
    * @return Vector of LoggingEvents
    */
-  private Vector decodeEvents(final Document document) {
-    Vector events = new Vector();
+  private Vector<LogEvent> decodeEvents(final Document document) {
+    Vector<LogEvent> events = new Vector<>();
 
     NodeList eventList = document.getElementsByTagName("record");
 
@@ -325,7 +323,7 @@ public class UtilLoggingXMLDecoder implements Decoder {
     String methodName = null;
     String fileName = null;
     String lineNumber = null;
-    Hashtable properties = new Hashtable();
+    Hashtable<String, String> properties = new Hashtable<>();
 
       //format of date: 2003-05-04T11:04:52
       //ignore date or set as a property? using millis in constructor instead
@@ -372,7 +370,7 @@ public class UtilLoggingXMLDecoder implements Decoder {
         }
 
         if (tagName.equalsIgnoreCase("exception")) {
-          ArrayList exceptionList = new ArrayList();
+          ArrayList<String> exceptionList = new ArrayList<>();
           NodeList exList = list.item(y).getChildNodes();
           int exlistLength = exList.getLength();
 
@@ -394,35 +392,33 @@ public class UtilLoggingXMLDecoder implements Decoder {
             }
           }
           if (exceptionList.size() > 0) {
-              exception =
-                (String[]) exceptionList.toArray(new String[exceptionList.size()]);
+              exception = exceptionList.toArray(new String[exceptionList.size()]);
           }
         }
       }
 
-        /**
+        /*
          * We add all the additional properties to the properties
          * hashtable. Override properties that already exist
          */
         if (additionalProperties.size() > 0) {
             if (properties == null) {
-                properties = new Hashtable(additionalProperties);
+                properties = new Hashtable<String, String>(additionalProperties);
             }
-            Iterator i = additionalProperties.entrySet().iterator();
-            while (i.hasNext()) {
-                Map.Entry e = (Map.Entry) i.next();
+            for (Object o : additionalProperties.entrySet()) {
+                Map.Entry e = (Map.Entry)o;
                 properties.put(e.getKey(), e.getValue());
             }
         }
 
-      LocationInfo info;
+      StackTraceElement info;
       if ((fileName != null)
               || (className != null)
               || (methodName != null)
               || (lineNumber != null)) {
-          info = new LocationInfo(fileName, className, methodName, lineNumber);
+          info = new StackTraceElement(fileName, className, methodName, Integer.parseInt(lineNumber));
       } else {
-        info = LocationInfo.NA_LOCATION_INFO;
+        info = null;
       }
 
         ThrowableInformation throwableInfo = null;
@@ -430,7 +426,7 @@ public class UtilLoggingXMLDecoder implements Decoder {
             throwableInfo = new ThrowableInformation(exception);
         }
 
-        LoggingEvent loggingEvent = new LoggingEvent(null,
+        LogEvent loggingEvent = new LogEvent(null,
                 logger, timeStamp, level, message,
                 threadName,
                 throwableInfo,
@@ -450,7 +446,7 @@ public class UtilLoggingXMLDecoder implements Decoder {
      * @return text content of all text or CDATA children of node.
      */
   private String getCData(final Node n) {
-    StringBuffer buf = new StringBuffer();
+    StringBuilder buf = new StringBuilder();
     NodeList nl = n.getChildNodes();
 
     for (int x = 0; x < nl.getLength(); x++) {

http://git-wip-us.apache.org/repos/asf/logging-chainsaw/blob/deb3b3c0/src/main/java/org/apache/log4j/xml/XMLDecoder.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/log4j/xml/XMLDecoder.java b/src/main/java/org/apache/log4j/xml/XMLDecoder.java
index 8ced851..dd9ca36 100644
--- a/src/main/java/org/apache/log4j/xml/XMLDecoder.java
+++ b/src/main/java/org/apache/log4j/xml/XMLDecoder.java
@@ -36,12 +36,13 @@ import javax.xml.parsers.DocumentBuilder;
 import javax.xml.parsers.DocumentBuilderFactory;
 import javax.xml.parsers.ParserConfigurationException;
 
-import org.apache.log4j.Level;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 import org.apache.log4j.spi.Decoder;
-import org.apache.log4j.spi.LocationInfo;
-import org.apache.log4j.spi.LoggingEvent;
-import org.apache.log4j.spi.ThrowableInformation;
+import org.apache.logging.log4j.core.LogEvent;
+import org.apache.logging.log4j.core.impl.Log4jLogEvent;
+import org.apache.logging.log4j.core.impl.ThrowableProxy;
 import org.w3c.dom.Document;
 import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
@@ -49,13 +50,13 @@ import org.xml.sax.InputSource;
 
 
 /**
- * Decodes Logging Events in XML formated into elements that are used by
+ * Decodes Log4j 1.2 XML formatted log events into elements that are used by
  * Chainsaw.
  *
  * This decoder can process a collection of log4j:event nodes ONLY
  * (no XML declaration nor eventSet node)
  *
- * NOTE:  Only a single LoggingEvent is returned from the decode method
+ * NOTE:  Only a single LogEvent is returned from the decode method
  * even though the DTD supports multiple events nested in an eventSet.
  *
  * NOTE: This class has been created on the assumption that all XML log files
@@ -94,7 +95,7 @@ public class XMLDecoder implements Decoder {
     /**
      * Additional properties.
      */
-  private Map additionalProperties = new HashMap();
+  private Map<String, String> additionalProperties = new HashMap<>();
     /**
      * Partial event.
      */
@@ -123,7 +124,6 @@ public class XMLDecoder implements Decoder {
     try {
       docBuilder = dbf.newDocumentBuilder();
       docBuilder.setErrorHandler(new SAXErrorHandler());
-      docBuilder.setEntityResolver(new Log4jEntityResolver());
     } catch (ParserConfigurationException pce) {
       System.err.println("Unable to get document builder");
     }
@@ -131,17 +131,17 @@ public class XMLDecoder implements Decoder {
 
   /**
    * Sets an additionalProperty map, where each Key/Value pair is
-   * automatically added to each LoggingEvent as it is decoded.
+   * automatically added to each LogEvent as it is decoded.
    *
    * This is useful, say, to include the source file name of the Logging events
    * @param properties additional properties
    */
-  public void setAdditionalProperties(final Map properties) {
+  public void setAdditionalProperties(final Map<String, String> properties) {
     this.additionalProperties = properties;
   }
 
   /**
-   * Converts the LoggingEvent data in XML string format into an actual
+   * Converts the LogEvent data in XML string format into an actual
    * XML Document class instance.
    * @param data XML fragment
    * @return dom document
@@ -158,7 +158,7 @@ public class XMLDecoder implements Decoder {
       // causes Crimson to barf. The Log4jEntityResolver only cares
       // about the "log4j.dtd" ending.
 
-      /**
+      /*
        * resetting the length of the StringBuffer is dangerous, particularly
        * on some JDK 1.4 impls, there's a known Bug that causes a memory leak
        */
@@ -184,7 +184,7 @@ public class XMLDecoder implements Decoder {
    * @return Vector of LoggingEvents
    * @throws IOException if IO error during processing.
    */
-  public Vector decode(final URL url) throws IOException {
+  public Vector<LogEvent> decode(final URL url) throws IOException {
     LineNumberReader reader;
     boolean isZipFile = url.getPath().toLowerCase().endsWith(".zip");
     InputStream inputStream;
@@ -204,10 +204,10 @@ public class XMLDecoder implements Decoder {
         reader = new LineNumberReader(new InputStreamReader(inputStream, ENCODING));
     }
 
-    Vector v = new Vector();
+    Vector<LogEvent> v = new Vector<>();
 
     String line;
-    Vector events;
+    Vector<LogEvent> events;
     try {
         while ((line = reader.readLine()) != null) {
             StringBuffer buffer = new StringBuffer(line);
@@ -238,7 +238,7 @@ public class XMLDecoder implements Decoder {
      * @param document to decode events from
      * @return Vector of LoggingEvents
      */
-  public Vector decodeEvents(final String document) {
+  public Vector<LogEvent> decodeEvents(final String document) {
     if (document != null) {
       if (document.trim().equals("")) {
         return null;
@@ -281,12 +281,12 @@ public class XMLDecoder implements Decoder {
 
   /**
    * Converts the string data into an XML Document, and then soaks out the
-   * relevant bits to form a new LoggingEvent instance which can be used
+   * relevant bits to form a new LogEvent instance which can be used
    * by any Log4j element locally.
    * @param data XML fragment
-   * @return a single LoggingEvent or null
+   * @return a single LogEvent or null
    */
-  public LoggingEvent decode(final String data) {
+  public LogEvent decode(final String data) {
     Document document = parse(data);
 
     if (document == null) {
@@ -296,7 +296,7 @@ public class XMLDecoder implements Decoder {
     Vector events = decodeEvents(document);
 
     if (events.size() > 0) {
-      return (LoggingEvent) events.firstElement();
+      return (LogEvent) events.firstElement();
     }
 
     return null;
@@ -307,8 +307,8 @@ public class XMLDecoder implements Decoder {
    * @param document XML document
    * @return Vector of LoggingEvents
    */
-  private Vector decodeEvents(final Document document) {
-    Vector events = new Vector();
+  private Vector<LogEvent> decodeEvents(final Document document) {
+    Vector<LogEvent> events = new Vector<>();
 
     Logger logger;
     long timeStamp;
@@ -335,7 +335,7 @@ public class XMLDecoder implements Decoder {
         if (eventNode.getNodeType() != Node.ELEMENT_NODE) {
             continue;
         }
-      logger = Logger.getLogger(eventNode.getAttributes().getNamedItem("logger").getNodeValue());
+      logger = LogManager.getLogger(eventNode.getAttributes().getNamedItem("logger").getNodeValue());
       timeStamp = Long.parseLong(eventNode.getAttributes().getNamedItem("timestamp").getNodeValue());
       level = Level.toLevel(eventNode.getAttributes().getNamedItem("level").getNodeValue());
       threadName = eventNode.getAttributes().getNamedItem("thread").getNodeValue();
@@ -433,21 +433,21 @@ public class XMLDecoder implements Decoder {
           }
       }
 
-      LocationInfo info;
+      StackTraceElement info;
       if ((fileName != null)
               || (className != null)
               || (methodName != null)
               || (lineNumber != null)) {
-          info = new LocationInfo(fileName, className, methodName, lineNumber);
+          info = new StackTraceElement(fileName, className, methodName, Integer.parseInt(lineNumber));
       } else {
-        info = LocationInfo.NA_LOCATION_INFO;
+        info = null;
       }
-      ThrowableInformation throwableInfo = null;
+      ThrowableProxy throwableInfo = null;
       if (exception != null) {
-          throwableInfo = new ThrowableInformation(exception);
+          throwableInfo = new ThrowableProxy(exception);
       }
 
-        LoggingEvent loggingEvent = new LoggingEvent(null,
+        LogEvent loggingEvent = new Log4jLogEvent(null,
                 logger, timeStamp, level, message,
                 threadName,
                 throwableInfo,

http://git-wip-us.apache.org/repos/asf/logging-chainsaw/blob/deb3b3c0/src/test/java/org/apache/log4j/rewrite/RewriteAppenderTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/log4j/rewrite/RewriteAppenderTest.java b/src/test/java/org/apache/log4j/rewrite/RewriteAppenderTest.java
deleted file mode 100644
index f15700d..0000000
--- a/src/test/java/org/apache/log4j/rewrite/RewriteAppenderTest.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * 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.log4j.rewrite;
-
-import junit.framework.*;
-import org.apache.log4j.*;
-import org.apache.log4j.util.Compare;
-import org.apache.log4j.xml.*;
-
-import java.io.InputStream;
-import java.util.Map;
-import java.util.HashMap;
-import java.util.TreeMap;
-import java.util.Hashtable;
-import javax.xml.parsers.*;
-import org.w3c.dom.*;
-
-public class RewriteAppenderTest extends TestCase {
-    public RewriteAppenderTest(final String name) {
-        super(name);
-    }
-
-    public void setUp() {
-        LogManager.getLoggerRepository().resetConfiguration();
-        Hashtable context = MDC.getContext();
-        if (context != null) {
-            context.clear();
-        }
-    }
-
-    public void tearDown() {
-        LogManager.getLoggerRepository().shutdown();
-    }
-
-    public void configure(final String resourceName) throws Exception {
-        InputStream is = RewriteAppenderTest.class.getResourceAsStream(resourceName);
-        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
-        factory.setNamespaceAware(false);
-        DocumentBuilder builder = factory.newDocumentBuilder();
-        Document doc = builder.parse(is);
-        DOMConfigurator.configure(doc.getDocumentElement());
-    }
-
-
-    public void testMapPolicy() throws Exception {
-        configure("map.xml");
-        Logger logger = Logger.getLogger(RewriteAppenderTest.class);
-        logger.info("Message 0");
-        MDC.put("p1", "Hola");
-
-        Map msg = new TreeMap();
-        msg.put("p1", "Hello");
-        msg.put("p2", "World");
-        msg.put("x1", "Mundo");
-        logger.info(msg);
-        msg.put("message", "Message 1");
-        logger.info(msg);
-        assertTrue(Compare.compare(RewriteAppenderTest.class, "temp", "map.log"));
-    }
-
-    private static class BaseBean {
-        private final Object p2;
-        private final Object x1;
-
-        public BaseBean(final Object p2,
-                        final Object x1) {
-             this.p2 = p2;
-             this.x1 = x1;
-        }
-
-        public Object getP2() {
-            return p2;
-        }
-
-        public Object getX1() {
-            return x1;
-        }
-
-        public String toString() {
-            return "I am bean.";
-        }
-    }
-
-    private static class MessageBean extends BaseBean {
-        private final Object msg;
-
-        public MessageBean(final Object msg,
-                           final Object p2,
-                           final Object x1) {
-            super(p2, x1);
-            this.msg = msg;
-        }
-
-        public Object getMessage() {
-            return msg;
-        }
-    }
-
-    public void testReflectionPolicy() throws Exception {
-        configure("reflection.xml");
-        Logger logger = Logger.getLogger(RewriteAppenderTest.class);
-        logger.info("Message 0");
-        logger.info(new BaseBean("Hello", "World" ));
-        MDC.put("p1", "Hola");
-        MDC.put("p2", "p2");
-        logger.info(new MessageBean("Welcome to The Hub", "Hello", "World" ));
-        assertTrue(Compare.compare(RewriteAppenderTest.class, "temp", "reflection.log"));
-    }
-
-    public void testPropertyPolicy() throws Exception {
-        configure("property.xml");
-        Logger logger = Logger.getLogger(RewriteAppenderTest.class);
-        logger.info("Message 0");
-        MDC.put("p1", "Hola");
-        logger.info("Message 1");
-        assertTrue(Compare.compare(RewriteAppenderTest.class, "temp", "property.log"));
-    }
-}

http://git-wip-us.apache.org/repos/asf/logging-chainsaw/blob/deb3b3c0/src/test/resources/org/apache/log4j/rewrite/map.log
----------------------------------------------------------------------
diff --git a/src/test/resources/org/apache/log4j/rewrite/map.log b/src/test/resources/org/apache/log4j/rewrite/map.log
deleted file mode 100644
index 3ce933f..0000000
--- a/src/test/resources/org/apache/log4j/rewrite/map.log
+++ /dev/null
@@ -1,3 +0,0 @@
-INFO org.apache.log4j.rewrite.RewriteAppenderTest - p1: p2: Message 0
-INFO org.apache.log4j.rewrite.RewriteAppenderTest - p1:Hello p2:World {p1=Hello, p2=World, x1=Mundo}
-INFO org.apache.log4j.rewrite.RewriteAppenderTest - p1:Hello p2:World Message 1

http://git-wip-us.apache.org/repos/asf/logging-chainsaw/blob/deb3b3c0/src/test/resources/org/apache/log4j/rewrite/map.xml
----------------------------------------------------------------------
diff --git a/src/test/resources/org/apache/log4j/rewrite/map.xml b/src/test/resources/org/apache/log4j/rewrite/map.xml
deleted file mode 100644
index 7cb60b7..0000000
--- a/src/test/resources/org/apache/log4j/rewrite/map.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<!--
- 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.
-
--->
-<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'>
-    <appender name="F1" class="org.apache.log4j.FileAppender">
-        <param name="file"   value="temp"/>
-        <param name="append" value="false"/>
-        <layout class="org.apache.log4j.PatternLayout">
-           <param name="ConversionPattern" value="%p %c - p1:%X{p1} p2:%X{p2} %m%n"/>
-        </layout>
-    </appender>
-
-
-  <appender name="A1" class="org.apache.log4j.rewrite.RewriteAppender">
-      <appender-ref ref="F1"/>
-      <rewritePolicy class="org.apache.log4j.rewrite.MapRewritePolicy"/>
-  </appender>
-
-  <root>
-    <level value ="debug" />
-    <appender-ref ref="A1" />
-  </root>
-
-</log4j:configuration>

http://git-wip-us.apache.org/repos/asf/logging-chainsaw/blob/deb3b3c0/src/test/resources/org/apache/log4j/rewrite/property.log
----------------------------------------------------------------------
diff --git a/src/test/resources/org/apache/log4j/rewrite/property.log b/src/test/resources/org/apache/log4j/rewrite/property.log
deleted file mode 100644
index 9aa2c49..0000000
--- a/src/test/resources/org/apache/log4j/rewrite/property.log
+++ /dev/null
@@ -1,2 +0,0 @@
-INFO org.apache.log4j.rewrite.RewriteAppenderTest - p1:Hello p2:World Message 0
-INFO org.apache.log4j.rewrite.RewriteAppenderTest - p1:Hola p2:World Message 1

http://git-wip-us.apache.org/repos/asf/logging-chainsaw/blob/deb3b3c0/src/test/resources/org/apache/log4j/rewrite/property.xml
----------------------------------------------------------------------
diff --git a/src/test/resources/org/apache/log4j/rewrite/property.xml b/src/test/resources/org/apache/log4j/rewrite/property.xml
deleted file mode 100644
index 13a04f8..0000000
--- a/src/test/resources/org/apache/log4j/rewrite/property.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<!--
- 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.
-
--->
-<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'>
-    <appender name="F1" class="org.apache.log4j.FileAppender">
-        <param name="file"   value="temp"/>
-        <param name="append" value="false"/>
-        <layout class="org.apache.log4j.PatternLayout">
-           <param name="ConversionPattern" value="%p %c - p1:%X{p1} p2:%X{p2} %m%n"/>
-        </layout>
-    </appender>
-
-
-  <appender name="A1" class="org.apache.log4j.rewrite.RewriteAppender">
-      <appender-ref ref="F1"/>
-      <rewritePolicy class="org.apache.log4j.rewrite.PropertyRewritePolicy">
-          <param name="properties" value="p1=Hello,p2=World,x1=3.1415"/>
-      </rewritePolicy>
-  </appender>
-
-  <root>
-    <level value ="debug" />
-    <appender-ref ref="A1" />
-  </root>
-
-</log4j:configuration>

http://git-wip-us.apache.org/repos/asf/logging-chainsaw/blob/deb3b3c0/src/test/resources/org/apache/log4j/rewrite/reflection.log
----------------------------------------------------------------------
diff --git a/src/test/resources/org/apache/log4j/rewrite/reflection.log b/src/test/resources/org/apache/log4j/rewrite/reflection.log
deleted file mode 100644
index da0b52f..0000000
--- a/src/test/resources/org/apache/log4j/rewrite/reflection.log
+++ /dev/null
@@ -1,3 +0,0 @@
-INFO org.apache.log4j.rewrite.RewriteAppenderTest - p1: p2: Message 0
-INFO org.apache.log4j.rewrite.RewriteAppenderTest - p1: p2:Hello I am bean.
-INFO org.apache.log4j.rewrite.RewriteAppenderTest - p1:Hola p2:Hello Welcome to The Hub

http://git-wip-us.apache.org/repos/asf/logging-chainsaw/blob/deb3b3c0/src/test/resources/org/apache/log4j/rewrite/reflection.xml
----------------------------------------------------------------------
diff --git a/src/test/resources/org/apache/log4j/rewrite/reflection.xml b/src/test/resources/org/apache/log4j/rewrite/reflection.xml
deleted file mode 100644
index 643850b..0000000
--- a/src/test/resources/org/apache/log4j/rewrite/reflection.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<!--
- 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.
-
--->
-<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'>
-    <appender name="F1" class="org.apache.log4j.FileAppender">
-        <param name="file"   value="temp"/>
-        <param name="append" value="false"/>
-        <layout class="org.apache.log4j.PatternLayout">
-           <param name="ConversionPattern" value="%p %c - p1:%X{p1} p2:%X{p2} %m%n"/>
-        </layout>
-    </appender>
-
-
-  <appender name="A1" class="org.apache.log4j.rewrite.RewriteAppender">
-      <appender-ref ref="F1"/>
-      <rewritePolicy class="org.apache.log4j.rewrite.ReflectionRewritePolicy"/>
-  </appender>
-
-  <root>
-    <level value ="debug" />
-    <appender-ref ref="A1" />
-  </root>
-
-</log4j:configuration>


[2/4] logging-chainsaw git commit: Try to upgrade to Log4j 2

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/logging-chainsaw/blob/deb3b3c0/src/main/java/org/apache/log4j/helpers/UtilLoggingLevel.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/log4j/helpers/UtilLoggingLevel.java b/src/main/java/org/apache/log4j/helpers/UtilLoggingLevel.java
index b15fbca..fe353eb 100644
--- a/src/main/java/org/apache/log4j/helpers/UtilLoggingLevel.java
+++ b/src/main/java/org/apache/log4j/helpers/UtilLoggingLevel.java
@@ -20,165 +20,85 @@ package org.apache.log4j.helpers;
 import java.util.ArrayList;
 import java.util.List;
 
-import org.apache.log4j.Level;
+import org.apache.logging.log4j.Level;
 
 /**
  * An extension of the Level class that provides support for java.util.logging
  * Levels.
  *
- *
  * @author Scott Deboy (sdeboy@apache.org)
  */
-
-public class UtilLoggingLevel extends Level {
-
-    /**
-     * Serialization version id.
-     */
-    private static final long serialVersionUID = 909301162611820211L;
+public final class UtilLoggingLevel {
 
     /**
      * Numerical value for SEVERE.
      */
-    public static final int SEVERE_INT = 22000;
+    private static final int SEVERE_INT = 22000;
     /**
      * Numerical value for WARNING.
      */
-    public static final int WARNING_INT = 21000;
+    private static final int WARNING_INT = 21000;
+
+    /**
+     * Numerical value for INFO.
+     */
+    private static final int INFO_INT = 20000;
 
-    //INFO level defined in parent as 20000..no need to redefine here
-    
     /**
      * Numerical value for CONFIG.
      */
-    public static final int CONFIG_INT = 14000;
+    private static final int CONFIG_INT = 14000;
+
     /**
      * Numerical value for FINE.
      */
-    public static final int FINE_INT = 13000;
+    private static final int FINE_INT = 13000;
+
     /**
      * Numerical value for FINER.
      */
-    public static final int FINER_INT = 12000;
+    private static final int FINER_INT = 12000;
+
     /**
      * Numerical value for FINEST.
      */
-    public static final int FINEST_INT = 11000;
-    /**
-     * Numerical value for UNKNOWN.
-     */
-    public static final int UNKNOWN_INT = 10000;
+    private static final int FINEST_INT = 11000;
 
     /**
      * SEVERE.
      */
-    public static final UtilLoggingLevel SEVERE =
-            new UtilLoggingLevel(SEVERE_INT, "SEVERE", 0);
+    private static final Level SEVERE =
+            Level.forName("SEVERE", SEVERE_INT);
     /**
      * WARNING.
      */
-    public static final UtilLoggingLevel WARNING =
-            new UtilLoggingLevel(WARNING_INT, "WARNING", 4);
+    private static final Level WARNING =
+            Level.forName("WARNING", WARNING_INT);
     /**
      * INFO.
      */
-    //note: we've aligned the int values of the java.util.logging INFO level with log4j's level
-    public static final UtilLoggingLevel INFO =
-            new UtilLoggingLevel(INFO_INT, "INFO", 5);
+    private static final Level INFO =
+            Level.forName("INFO", INFO_INT);
     /**
      * CONFIG.
      */
-    public static final UtilLoggingLevel CONFIG =
-            new UtilLoggingLevel(CONFIG_INT, "CONFIG", 6);
+    private static final Level CONFIG =
+            Level.forName("CONFIG", CONFIG_INT);
     /**
      * FINE.
      */
-    public static final UtilLoggingLevel FINE =
-            new UtilLoggingLevel(FINE_INT, "FINE", 7);
+    private static final Level FINE =
+            Level.forName("FINE", FINE_INT);
     /**
      * FINER.
      */
-    public static final UtilLoggingLevel FINER =
-            new UtilLoggingLevel(FINER_INT, "FINER", 8);
+    private static final Level FINER =
+            Level.forName("FINER", FINER_INT);
     /**
      * FINEST.
      */
-    public static final UtilLoggingLevel FINEST =
-            new UtilLoggingLevel(FINEST_INT, "FINEST", 9);
-
-    /**
-     * Create new instance.
-     * @param level numeric value for level.
-     * @param levelStr symbolic name for level.
-     * @param syslogEquivalent Equivalent syslog severity.
-     */
-    protected UtilLoggingLevel(final int level,
-                               final String levelStr,
-                               final int syslogEquivalent) {
-        super(level, levelStr, syslogEquivalent);
-    }
-
-    /**
-     * Convert an integer passed as argument to a level. If the
-     * conversion fails, then this method returns the specified default.
-     * @param val numeric value.
-     * @param defaultLevel level to be returned if no level matches
-     * numeric value.
-     * @return matching level or default level.
-     */
-    public static UtilLoggingLevel toLevel(final int val,
-                               final UtilLoggingLevel defaultLevel) {
-        switch (val) {
-            case SEVERE_INT:
-                return SEVERE;
-
-            case WARNING_INT:
-                return WARNING;
-
-            case INFO_INT:
-                return INFO;
-
-            case CONFIG_INT:
-                return CONFIG;
-
-            case FINE_INT:
-                return FINE;
-
-            case FINER_INT:
-                return FINER;
-
-            case FINEST_INT:
-                return FINEST;
-
-            default:
-                return defaultLevel;
-        }
-    }
-
-    /**
-     * Gets level matching numeric value.
-     * @param val numeric value.
-     * @return  matching level or UtilLoggerLevel.FINEST if no match.
-     */
-    public static Level toLevel(final int val) {
-        return toLevel(val, FINEST);
-    }
-
-    /**
-     * Gets list of supported levels.
-     * @return  list of supported levels.
-     */
-    public static List getAllPossibleLevels() {
-        ArrayList list = new ArrayList();
-        list.add(FINE);
-        list.add(FINER);
-        list.add(FINEST);
-        list.add(INFO);
-        list.add(CONFIG);
-        list.add(WARNING);
-        list.add(SEVERE);
-        return list;
-    }
+    private static final Level FINEST =
+            Level.forName("FINEST", FINEST_INT);
 
     /**
      * Get level with specified symbolic name.

http://git-wip-us.apache.org/repos/asf/logging-chainsaw/blob/deb3b3c0/src/main/java/org/apache/log4j/net/MulticastAppender.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/log4j/net/MulticastAppender.java b/src/main/java/org/apache/log4j/net/MulticastAppender.java
deleted file mode 100644
index 039224d..0000000
--- a/src/main/java/org/apache/log4j/net/MulticastAppender.java
+++ /dev/null
@@ -1,345 +0,0 @@
-/*
- * 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.log4j.net;
-
-import java.io.IOException;
-import java.net.DatagramPacket;
-import java.net.InetAddress;
-import java.net.MulticastSocket;
-import java.net.UnknownHostException;
-import java.util.HashMap;
-import java.util.Hashtable;
-import java.util.Map;
-
-import org.apache.log4j.AppenderSkeleton;
-import org.apache.log4j.helpers.Constants;
-import org.apache.log4j.spi.LoggingEvent;
-import org.apache.log4j.helpers.LogLog;
-import org.apache.log4j.xml.XMLLayout;
-
-
-/**
- *  Multicast-based Appender.  Works in conjunction with the MulticastReceiver, which expects
- *  a LoggingEvent encoded using XMLLayout. 
- * 
- *  Sends log information as a multicast datagrams.
- *
- *  <p>Messages are not sent as LoggingEvent objects but as text after
- *  applying XMLLayout.
- *
- *  <p>The port and remoteHost properties can be set in configuration properties.
- *  By setting the remoteHost to a broadcast address any number of clients can
- *  listen for log messages.
- *
- *  <p>This was inspired and really extended/copied from {@link SocketAppender}.  Please
- *  see the docs for the proper credit to the authors of that class.
- *
- *  @author  <a href="mailto:kbrown@versatilesolutions.com">Kevin Brown</a>
- *  @author Scott Deboy &lt;sdeboy@apache.org&gt;
- * 
- */
-public class MulticastAppender extends AppenderSkeleton implements PortBased {
-  /**
-     The default port number for the multicast packets. (9991).
-  */
-  static final int DEFAULT_PORT = 9991;
-
-  /**
-   * The MulticastDNS zone advertised by a MulticastAppender
-   * the MulticastAppender also adds a 'multicastAddress' property with the multicast address value as a string
-   */
-  public static final String ZONE = "_log4j_xml_mcast_appender.local.";
-
-  /**
-     We remember host name as String in addition to the resolved
-     InetAddress so that it can be returned via getOption().
-  */
-  String hostname;
-  String remoteHost;
-  String application;
-  int timeToLive;
-  InetAddress address;
-  int port = DEFAULT_PORT;
-  MulticastSocket outSocket;
-  private String encoding;
-
-  private boolean locationInfo = false;
-  private boolean advertiseViaMulticastDNS;
-  private ZeroConfSupport zeroConf;
-
-  public MulticastAppender() {
-     super(false);
-  }
-
-  /**
-     Open the multicast sender for the <b>RemoteHost</b> and <b>Port</b>.
-  */
-  public void activateOptions() {
-    try {
-      hostname = InetAddress.getLocalHost().getHostName();
-    } catch (UnknownHostException uhe) {
-      try {
-        hostname = InetAddress.getLocalHost().getHostAddress();
-      } catch (UnknownHostException uhe2) {
-        hostname = "unknown";
-      }
-    }
-
-    //allow system property of application to be primary
-    if (application == null) {
-      application = System.getProperty(Constants.APPLICATION_KEY);
-    } else {
-      if (System.getProperty(Constants.APPLICATION_KEY) != null) {
-        application = application + "-" + System.getProperty(Constants.APPLICATION_KEY);
-      }
-    }
-
-    if(remoteHost != null) {
-      address = getAddressByName(remoteHost);
-    } else {
-      String err = "The RemoteHost property is required for MulticastAppender named "+ name;
-      LogLog.error(err);
-      throw new IllegalStateException(err);
-    }
-
-    if (layout == null) {
-        layout = new XMLLayout();
-    }
-      
-    if (advertiseViaMulticastDNS) {
-        Map properties = new HashMap();
-        properties.put("multicastAddress", remoteHost);
-        zeroConf = new ZeroConfSupport(ZONE, port, getName(), properties);
-        zeroConf.advertise();
-    }
-    connect();
-    super.activateOptions();
-  }
-
-  /**
-     Close this appender.
-     <p>This will mark the appender as closed and
-     call then {@link #cleanUp} method.
-  */
-  public synchronized void close() {
-    if (closed) {
-      return;
-    }
-
-    this.closed = true;
-    if (advertiseViaMulticastDNS) {
-        zeroConf.unadvertise();
-    }
-    cleanUp();
-  }
-
-  /**
-     Close the Socket and release the underlying
-     connector thread if it has been created
-   */
-  public void cleanUp() {
-    if (outSocket != null) {
-      try {
-        outSocket.close();
-      } catch (Exception e) {
-        LogLog.error("Could not close outSocket.", e);
-      }
-
-      outSocket = null;
-    }
-  }
-
-  void connect() {
-    if (this.address == null) {
-      return;
-    }
-
-    try {
-      // First, close the previous connection if any.
-      cleanUp();
-      outSocket = new MulticastSocket();
-      outSocket.setTimeToLive(timeToLive);
-    } catch (IOException e) {
-      LogLog.error("Error in connect method of MulticastAppender named "+name, e);
-    }
-  }
-
-  public void append(LoggingEvent event) {
-    if (event == null) {
-      return;
-    }
-
-    if(locationInfo) {
-	   event.getLocationInformation();
-	}
-
-    if (outSocket != null) {
-        event.setProperty(Constants.HOSTNAME_KEY, hostname);
-
-        if (application != null) {
-          event.setProperty(Constants.APPLICATION_KEY, application);
-        }
-      
-		if(locationInfo) {
-		   event.getLocationInformation();
-		}
-
-
-      try {
-        StringBuffer buf = new StringBuffer(layout.format(event));
-
-        byte[] payload;
-        if(encoding == null) {
-          payload = buf.toString().getBytes();
-        } else {
-          payload = buf.toString().getBytes(encoding);
-        }
-
-        DatagramPacket dp =
-           new DatagramPacket(payload, payload.length, address, port);
-        outSocket.send(dp);
-      } catch (IOException e) {
-        outSocket = null;
-        LogLog.warn("Detected problem with Multicast connection: " + e);
-      }
-    }
-  }
-
-  InetAddress getAddressByName(String host) {
-    try {
-      return InetAddress.getByName(host);
-    } catch (Exception e) {
-      LogLog.error("Could not find address of [" + host + "].", e);
-      return null;
-    }
-  }
-
-  /**
-     The <b>RemoteHost</b> option takes a string value which should be
-     the host name or ipaddress to send the multicast packets.
-   */
-  public void setRemoteHost(String host) {
-    remoteHost = host;
-  }
-
-  /**
-     Returns value of the <b>RemoteHost</b> option.
-   */
-  public String getRemoteHost() {
-    return remoteHost;
-  }
-
-  /**
-  The <b>LocationInfo</b> option takes a boolean value. If true,
-  the information sent to the remote host will include location
-  information. By default no location information is sent to the server.
-   */
-  public void setLocationInfo(boolean locationInfo) {
-	  this.locationInfo = locationInfo;
-  }
-
-  /**
-   * Returns value of the <b>LocationInfo</b> option.
-   */
-  public boolean getLocationInfo() {
-	  return locationInfo;
-  }
-
-  /**
-      The <b>Encoding</b> option specifies how the bytes are encoded.  If this option is not specified, 
-      the System encoding is used.
-    */
-   public void setEncoding(String encoding) {
-     this.encoding = encoding;
-   }
-
-   /**
-      Returns value of the <b>Encoding</b> option.
-    */
-   public String getEncoding() {
-     return encoding;
-   }
-  /**
-     The <b>App</b> option takes a string value which should be the name of the application getting logged.
-     If property was already set (via system property), don't set here.
-   */
-  public void setApplication(String app) {
-    this.application = app;
-  }
-
-  /**
-     Returns value of the <b>App</b> option.
-   */
-  public String getApplication() {
-    return application;
-  }
-
-  /**
-     The <b>Time to live</b> option takes a positive integer representing
-     the time to live value.
-   */
-  public void setTimeToLive(int timeToLive) {
-    this.timeToLive = timeToLive;
-  }
-
-  /**
-     Returns value of the <b>Time to Live</b> option.
-   */
-  public int getTimeToLive() {
-    return timeToLive;
-  }
-
-  /**
-     The <b>Port</b> option takes a positive integer representing
-     the port where multicast packets will be sent.
-   */
-  public void setPort(int port) {
-    this.port = port;
-  }
-
-  /**
-     Returns value of the <b>Port</b> option.
-   */
-  public int getPort() {
-    return port;
-  }
-
-  /* (non-Javadoc)
-   * @see org.apache.log4j.net.NetworkBased#isActive()
-   */
-  public boolean isActive() {
-    // TODO handle active/inactive
-    return true;
-  }
-
-    /**
-     * Gets whether appender requires a layout.
-     * @return false
-     */
-  public boolean requiresLayout() {
-      return true;
-  }
-
-  public boolean isAdvertiseViaMulticastDNS() {
-      return advertiseViaMulticastDNS;
-  }
-
-  public void setAdvertiseViaMulticastDNS(boolean advertiseViaMulticastDNS) {
-      this.advertiseViaMulticastDNS = advertiseViaMulticastDNS;
-  }
-}

http://git-wip-us.apache.org/repos/asf/logging-chainsaw/blob/deb3b3c0/src/main/java/org/apache/log4j/net/SocketNode13.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/log4j/net/SocketNode13.java b/src/main/java/org/apache/log4j/net/SocketNode13.java
index e27c68e..d98dd75 100644
--- a/src/main/java/org/apache/log4j/net/SocketNode13.java
+++ b/src/main/java/org/apache/log4j/net/SocketNode13.java
@@ -26,19 +26,19 @@ import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
 
-import org.apache.log4j.Logger;
 import org.apache.log4j.helpers.Constants;
 import org.apache.log4j.plugins.Pauseable;
 import org.apache.log4j.plugins.Receiver;
 import org.apache.log4j.spi.ComponentBase;
 import org.apache.log4j.spi.LoggerRepository;
-import org.apache.log4j.spi.LoggingEvent;
+import org.apache.logging.log4j.Logger;
+import org.apache.logging.log4j.core.LogEvent;
 
 
 // Contributors:  Moses Hohman <mm...@rainbow.uchicago.edu>
 
 /**
-   Read {@link LoggingEvent} objects sent from a remote client using
+   Read {@link LogEvent} objects sent from a remote client using
    Sockets (TCP). These logging events are logged according to local
    policy, as if they were generated locally.
 
@@ -142,7 +142,7 @@ public class SocketNode13 extends ComponentBase implements Runnable, Pauseable {
      * Deserialize events from socket until interrupted.
      */
   public void run() {
-    LoggingEvent event;
+    LogEvent event;
     Logger remoteLogger;
     Exception listenerException = null;
     ObjectInputStream ois = null;
@@ -171,10 +171,10 @@ public class SocketNode13 extends ComponentBase implements Runnable, Pauseable {
       try {
         while (!isClosed()) {
           // read an event from the wire
-          event = (LoggingEvent) ois.readObject();
-          event.setProperty(Constants.HOSTNAME_KEY, hostName);
+          event = (LogEvent) ois.readObject();
+          event.getContextMap().put(Constants.HOSTNAME_KEY, hostName);
           // store the known remote info in an event property
-          event.setProperty("log4j.remoteSourceInfo", remoteInfo);
+          event.getContextMap().put("log4j.remoteSourceInfo", remoteInfo);
 
           // if configured with a receiver, tell it to post the event
           if (!isPaused() && !isClosed()) {
@@ -191,9 +191,9 @@ public class SocketNode13 extends ComponentBase implements Runnable, Pauseable {
               // apply the logger-level filter
               if (event
                 .getLevel()
-                .isGreaterOrEqual(remoteLogger.getEffectiveLevel())) {
+                .isLessSpecificThan(remoteLogger.getLevel())) {
                 // finally log the event as if was generated locally
-                remoteLogger.callAppenders(event);
+                remoteLogger. callAppenders(event);
               }
             }
           } else {

http://git-wip-us.apache.org/repos/asf/logging-chainsaw/blob/deb3b3c0/src/main/java/org/apache/log4j/net/SocketReceiver.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/log4j/net/SocketReceiver.java b/src/main/java/org/apache/log4j/net/SocketReceiver.java
index 9d4aac9..1310b61 100644
--- a/src/main/java/org/apache/log4j/net/SocketReceiver.java
+++ b/src/main/java/org/apache/log4j/net/SocketReceiver.java
@@ -33,7 +33,7 @@ import org.apache.log4j.plugins.Pauseable;
 import org.apache.log4j.plugins.Plugin;
 import org.apache.log4j.plugins.Receiver;
 import org.apache.log4j.spi.LoggerRepository;
-import org.apache.log4j.spi.LoggingEvent;
+import org.apache.logging.log4j.core.LogEvent;
 
 
 /**
@@ -470,7 +470,7 @@ public class SocketReceiver extends Receiver implements Runnable, PortBased,
     }
   }
     /** {@inheritDoc} */
-  public void doPost(final LoggingEvent event) {
+  public void doPost(final LogEvent event) {
     if (!isPaused()) {
       super.doPost(event);
     }

http://git-wip-us.apache.org/repos/asf/logging-chainsaw/blob/deb3b3c0/src/main/java/org/apache/log4j/net/UDPAppender.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/log4j/net/UDPAppender.java b/src/main/java/org/apache/log4j/net/UDPAppender.java
deleted file mode 100644
index 6cfe2a6..0000000
--- a/src/main/java/org/apache/log4j/net/UDPAppender.java
+++ /dev/null
@@ -1,330 +0,0 @@
-/*
- * 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.log4j.net;
-
-import org.apache.log4j.AppenderSkeleton;
-import org.apache.log4j.helpers.Constants;
-import org.apache.log4j.spi.LoggingEvent;
-import org.apache.log4j.helpers.LogLog;
-import org.apache.log4j.xml.XMLLayout;
-
-import java.io.IOException;
-import java.net.DatagramPacket;
-import java.net.DatagramSocket;
-import java.net.InetAddress;
-import java.net.UnknownHostException;
-
-
-
-/**
- *  Sends log information as a UDP datagrams.
- *
- *  <p>The UDPAppender is meant to be used as a diagnostic logging tool
- *  so that logging can be monitored by a simple UDP client.
- *
- *  <p>Messages are not sent as LoggingEvent objects but as text after
- *  applying the designated Layout.
- *
- *  <p>The port and remoteHost properties can be set in configuration properties.
- *  By setting the remoteHost to a broadcast address any number of clients can
- *  listen for log messages.
- *
- *  <p>This was inspired and really extended/copied from {@link SocketAppender}.
- *  Please see the docs for the proper credit to the authors of that class.
- *
- *  @author  <a href="mailto:kbrown@versatilesolutions.com">Kevin Brown</a>
- *  @author Scott Deboy &lt;sdeboy@apache.org&gt;
- */
-public class UDPAppender extends AppenderSkeleton implements PortBased{
-  /**
-    * The default port number for the UDP packets, 9991.
-  */
-  public static final int DEFAULT_PORT = 9991;
-
-  /**
-     We remember host name as String in addition to the resolved
-     InetAddress so that it can be returned via getOption().
-  */
-  String hostname;
-  String remoteHost;
-  String application;
-  String encoding;
-  InetAddress address;
-  int port = DEFAULT_PORT;
-  DatagramSocket outSocket;
-
-  /**
-   * The MulticastDNS zone advertised by a UDPAppender
-   */
-  public static final String ZONE = "_log4j_xml_udp_appender.local.";
-
-  // if there is something irrecoverably wrong with the settings, there is no
-  // point in sending out packeets.
-  boolean inError = false;
-  private boolean advertiseViaMulticastDNS;
-  private ZeroConfSupport zeroConf;
-
-    public UDPAppender() {
-      super(false);
-  }
-
-  /**
-     Sends UDP packets to the <code>address</code> and <code>port</code>.
-  */
-  public UDPAppender(final InetAddress address, final int port) {
-    super(false);
-    this.address = address;
-    this.remoteHost = address.getHostName();
-    this.port = port;
-    activateOptions();
-  }
-
-  /**
-     Sends UDP packets to the <code>address</code> and <code>port</code>.
-  */
-  public UDPAppender(final String host, final int port) {
-    super(false);
-    this.port = port;
-    this.address = getAddressByName(host);
-    this.remoteHost = host;
-    activateOptions();
-  }
-
-  /**
-     Open the UDP sender for the <b>RemoteHost</b> and <b>Port</b>.
-  */
-  public void activateOptions() {
-    try {
-      hostname = InetAddress.getLocalHost().getHostName();
-    } catch (UnknownHostException uhe) {
-      try {
-        hostname = InetAddress.getLocalHost().getHostAddress();
-      } catch (UnknownHostException uhe2) {
-        hostname = "unknown";
-      }
-    }
-
-    //allow system property of application to be primary
-    if (application == null) {
-      application = System.getProperty(Constants.APPLICATION_KEY);
-    } else {
-      if (System.getProperty(Constants.APPLICATION_KEY) != null) {
-        application = application + "-" + System.getProperty(Constants.APPLICATION_KEY);
-      }
-    }
-
-    if(remoteHost != null) {
-      address = getAddressByName(remoteHost);
-      connect(address, port);
-    } else {
-      String err = "The RemoteHost property is required for SocketAppender named "+ name;
-      LogLog.error(err);
-      throw new IllegalStateException(err);
-    }
-
-    if (layout == null) {
-        layout = new XMLLayout();
-    }
-
-    if (advertiseViaMulticastDNS) {
-      zeroConf = new ZeroConfSupport(ZONE, port, getName());
-      zeroConf.advertise();
-    }
-
-    super.activateOptions();
-  }
-
-  /**
-     Close this appender.
-     <p>This will mark the appender as closed and
-     call then {@link #cleanUp} method.
-  */
-  public synchronized void close() {
-    if (closed) {
-      return;
-    }
-
-    if (advertiseViaMulticastDNS) {
-      zeroConf.unadvertise();
-    }
-      
-    this.closed = true;
-    cleanUp();
-  }
-
-  /**
-     Close the UDP Socket and release the underlying
-     connector thread if it has been created
-   */
-  public void cleanUp() {
-    if (outSocket != null) {
-      try {
-        outSocket.close();
-      } catch (Exception e) {
-        LogLog.error("Could not close outSocket.", e);
-      }
-
-      outSocket = null;
-    }
-  }
-
-  void connect(InetAddress address, int port) {
-    if (this.address == null) {
-      return;
-    }
-
-    try {
-      // First, close the previous connection if any.
-      cleanUp();
-      outSocket = new DatagramSocket();
-      outSocket.connect(address, port);
-    } catch (IOException e) {
-      LogLog.error(
-        "Could not open UDP Socket for sending.", e);
-      inError = true;
-    }
-  }
-
-  public void append(LoggingEvent event) {
-    if(inError) {
-      return;
-    }
-    
-    if (event == null) {
-      return;
-    }
-
-    if (address == null) {
-      return;
-    }
-
-    if (outSocket != null) {
-      event.setProperty(Constants.HOSTNAME_KEY, hostname);
-      if (application != null) {
-        event.setProperty(Constants.APPLICATION_KEY, application);
-      }
-
-      try {
-        StringBuffer buf = new StringBuffer(layout.format(event));
-
-        byte[] payload;
-        if(encoding == null) {
-          payload = buf.toString().getBytes();
-        } else {
-          payload = buf.toString().getBytes(encoding);
-        }
-
-        DatagramPacket dp =
-           new DatagramPacket(payload, payload.length, address, port);
-        outSocket.send(dp);
-      } catch (IOException e) {
-        outSocket = null;
-        LogLog.warn("Detected problem with UDP connection: " + e);
-      }
-    }
-  }
-
-  public boolean isActive() {
-    return !inError;
-  }
-  
-  InetAddress getAddressByName(String host) {
-    try {
-      return InetAddress.getByName(host);
-    } catch (Exception e) {
-      LogLog.error("Could not find address of [" + host + "].", e);
-      return null;
-    }
-  }
-
-  /**
-     The UDPAppender uses layouts. Hence, this method returns
-     <code>true</code>.
-  */
-  public boolean requiresLayout() {
-    return true;
-  }
-
-  /**
-     The <b>RemoteHost</b> option takes a string value which should be
-     the host name or ipaddress to send the UDP packets.
-   */
-  public void setRemoteHost(String host) {
-    remoteHost = host;
-  }
-
-  /**
-     Returns value of the <b>RemoteHost</b> option.
-   */
-  public String getRemoteHost() {
-    return remoteHost;
-  }
-
-  /**
-     The <b>App</b> option takes a string value which should be the name of the application getting logged.
-     If property was already set (via system property), don't set here.
-   */
-  public void setApplication(String app) {
-    this.application = app;
-  }
-
-  /**
-     Returns value of the <b>App</b> option.
-   */
-  public String getApplication() {
-    return application;
-  }
-
-  /**
-     The <b>Encoding</b> option specifies how the bytes are encoded.  If this option is not specified, 
-     the System encoding is used.
-   */
-  public void setEncoding(String encoding) {
-    this.encoding = encoding;
-  }
-
-  /**
-     Returns value of the <b>Encoding</b> option.
-   */
-  public String getEncoding() {
-    return encoding;
-  }
-
-    /**
-     The <b>Port</b> option takes a positive integer representing
-     the port where UDP packets will be sent.
-   */
-  public void setPort(int port) {
-    this.port = port;
-  }
-
-  /**
-     Returns value of the <b>Port</b> option.
-   */
-  public int getPort() {
-    return port;
-  }
-
-  public void setAdvertiseViaMulticastDNS(boolean advertiseViaMulticastDNS) {
-    this.advertiseViaMulticastDNS = advertiseViaMulticastDNS;
-  }
-
-  public boolean isAdvertiseViaMulticastDNS() {
-    return advertiseViaMulticastDNS;
-  }
-}

http://git-wip-us.apache.org/repos/asf/logging-chainsaw/blob/deb3b3c0/src/main/java/org/apache/log4j/net/ZeroConfSupport.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/log4j/net/ZeroConfSupport.java b/src/main/java/org/apache/log4j/net/ZeroConfSupport.java
new file mode 100644
index 0000000..520ff53
--- /dev/null
+++ b/src/main/java/org/apache/log4j/net/ZeroConfSupport.java
@@ -0,0 +1,193 @@
+/*
+ * 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.log4j.net;
+
+import org.apache.logging.log4j.status.StatusLogger;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Hashtable;
+import java.util.Map;
+
+public class ZeroConfSupport {
+    private static Object jmDNS = initializeJMDNS();
+
+    private static Class jmDNSClass;
+    private static Class serviceInfoClass;
+
+    private Object serviceInfo;
+
+    public ZeroConfSupport(String zone, int port, String name, Map properties) {
+        //if version 3 is available, use it to construct a serviceInfo instance, otherwise support the version1 API
+        boolean isVersion3 = false;
+        try {
+            //create method is in version 3, not version 1
+            jmDNSClass.getMethod("create", null);
+            isVersion3 = true;
+        } catch (NoSuchMethodException e) {
+            //no-op
+        }
+
+        if (isVersion3) {
+            StatusLogger.getLogger().debug("using JmDNS version 3 to construct serviceInfo instance");
+            serviceInfo = buildServiceInfoVersion3(zone, port, name, properties);
+        } else {
+            StatusLogger.getLogger().debug("using JmDNS version 1.0 to construct serviceInfo instance");
+            serviceInfo = buildServiceInfoVersion1(zone, port, name, properties);
+        }
+    }
+
+    public ZeroConfSupport(String zone, int port, String name) {
+        this(zone, port, name, new HashMap());
+    }
+
+    private static Object createJmDNSVersion1() {
+        try {
+            return jmDNSClass.newInstance();
+        } catch (InstantiationException | IllegalAccessException e) {
+            StatusLogger.getLogger().warn("Unable to instantiate JMDNS", e);
+        }
+        return null;
+    }
+
+    private static Object createJmDNSVersion3() {
+        try {
+            Method jmDNSCreateMethod = jmDNSClass.getMethod("create", null);
+            return jmDNSCreateMethod.invoke(null, null);
+        } catch (IllegalAccessException e) {
+            StatusLogger.getLogger().warn("Unable to instantiate jmdns class", e);
+        } catch (NoSuchMethodException e) {
+            StatusLogger.getLogger().warn("Unable to access constructor", e);
+        } catch (InvocationTargetException e) {
+            StatusLogger.getLogger().warn("Unable to call constructor", e);
+        }
+        return null;
+    }
+
+    private Object buildServiceInfoVersion1(String zone, int port, String name, Map properties) {
+        //version 1 uses a hashtable
+        Hashtable hashtableProperties = new Hashtable(properties);
+        try {
+            Class[] args = new Class[6];
+            args[0] = String.class;
+            args[1] = String.class;
+            args[2] = int.class;
+            args[3] = int.class; //weight (0)
+            args[4] = int.class; //priority (0)
+            args[5] = Hashtable.class;
+            Constructor constructor = serviceInfoClass.getConstructor(args);
+            Object[] values = new Object[6];
+            values[0] = zone;
+            values[1] = name;
+            values[2] = port;
+            values[3] = 0;
+            values[4] = 0;
+            values[5] = hashtableProperties;
+            Object result = constructor.newInstance(values);
+            StatusLogger.getLogger().debug("created serviceinfo: " + result);
+            return result;
+        } catch (IllegalAccessException | InstantiationException | InvocationTargetException e) {
+            StatusLogger.getLogger().warn("Unable to construct ServiceInfo instance", e);
+        } catch (NoSuchMethodException e) {
+            StatusLogger.getLogger().warn("Unable to get ServiceInfo constructor", e);
+        }
+        return null;
+    }
+
+    private Object buildServiceInfoVersion3(String zone, int port, String name, Map properties) {
+        try {
+            Class[] args = new Class[6];
+            args[0] = String.class; //zone/type
+            args[1] = String.class; //display name
+            args[2] = int.class; //port
+            args[3] = int.class; //weight (0)
+            args[4] = int.class; //priority (0)
+            args[5] = Map.class;
+            Method serviceInfoCreateMethod = serviceInfoClass.getMethod("create", args);
+            Object[] values = new Object[6];
+            values[0] = zone;
+            values[1] = name;
+            values[2] = port;
+            values[3] = 0;
+            values[4] = 0;
+            values[5] = properties;
+            Object result = serviceInfoCreateMethod.invoke(null, values);
+            StatusLogger.getLogger().debug("created serviceinfo: " + result);
+            return result;
+        } catch (IllegalAccessException | InvocationTargetException e) {
+            StatusLogger.getLogger().warn("Unable to invoke create method", e);
+        } catch (NoSuchMethodException e) {
+            StatusLogger.getLogger().warn("Unable to find create method", e);
+        }
+        return null;
+    }
+
+    public void advertise() {
+        try {
+            Method method = jmDNSClass.getMethod("registerService", new Class[] {serviceInfoClass});
+            method.invoke(jmDNS, serviceInfo);
+            StatusLogger.getLogger().debug("registered serviceInfo: " + serviceInfo);
+        } catch (IllegalAccessException | InvocationTargetException e) {
+            StatusLogger.getLogger().warn("Unable to invoke registerService method", e);
+        } catch (NoSuchMethodException e) {
+            StatusLogger.getLogger().warn("No registerService method", e);
+        }
+    }
+
+    public void unadvertise() {
+        try {
+            Method method = jmDNSClass.getMethod("unregisterService", serviceInfoClass);
+            method.invoke(jmDNS, serviceInfo);
+            StatusLogger.getLogger().debug("unregistered serviceInfo: " + serviceInfo);
+        } catch (IllegalAccessException | InvocationTargetException e) {
+            StatusLogger.getLogger().warn("Unable to invoke unregisterService method", e);
+        } catch (NoSuchMethodException e) {
+            StatusLogger.getLogger().warn("No unregisterService method", e);
+        }
+    }
+
+    private static Object initializeJMDNS() {
+        try {
+            jmDNSClass = Class.forName("javax.jmdns.JmDNS");
+            serviceInfoClass = Class.forName("javax.jmdns.ServiceInfo");
+        } catch (ClassNotFoundException e) {
+            StatusLogger.getLogger().warn("JmDNS or serviceInfo class not found", e);
+        }
+
+        //if version 3 is available, use it to construct a serviceInfo instance, otherwise support the version1 API
+        boolean isVersion3 = false;
+        try {
+            //create method is in version 3, not version 1
+            jmDNSClass.getMethod("create", null);
+            isVersion3 = true;
+        } catch (NoSuchMethodException e) {
+            //no-op
+        }
+
+        if (isVersion3) {
+            return createJmDNSVersion3();
+        } else {
+            return createJmDNSVersion1();
+        }
+    }
+
+    public static Object getJMDNSInstance() {
+        return jmDNS;
+    }
+}

http://git-wip-us.apache.org/repos/asf/logging-chainsaw/blob/deb3b3c0/src/main/java/org/apache/log4j/or/DefaultRenderer.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/log4j/or/DefaultRenderer.java b/src/main/java/org/apache/log4j/or/DefaultRenderer.java
new file mode 100644
index 0000000..7fe4ac6
--- /dev/null
+++ b/src/main/java/org/apache/log4j/or/DefaultRenderer.java
@@ -0,0 +1,42 @@
+/*
+ * 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.log4j.or;
+
+/**
+   The default Renderer renders objects by calling their
+   <code>toString</code> method.
+
+   @author Ceki G&uuml;lc&uuml;
+   @since 1.0 */
+class DefaultRenderer implements ObjectRenderer {
+  
+  DefaultRenderer() {
+  }
+
+  /**
+     Render the object passed as parameter by calling its
+     <code>toString</code> method.  */
+  public
+  String doRender(final Object o) {
+          try {
+            return o.toString();
+          } catch(Exception ex) {
+            return ex.toString();
+          }
+  }
+}  

http://git-wip-us.apache.org/repos/asf/logging-chainsaw/blob/deb3b3c0/src/main/java/org/apache/log4j/or/ObjectRenderer.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/log4j/or/ObjectRenderer.java b/src/main/java/org/apache/log4j/or/ObjectRenderer.java
new file mode 100644
index 0000000..8ad9943
--- /dev/null
+++ b/src/main/java/org/apache/log4j/or/ObjectRenderer.java
@@ -0,0 +1,32 @@
+/*
+ * 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.log4j.or;
+
+/**
+   Implement this interface in order to render objects as strings.
+
+   @author Ceki G&uuml;lc&uuml;
+   @since 1.0 */
+public interface ObjectRenderer {
+
+  /**
+     Render the object passed as parameter as a String.
+   */
+  public
+  String doRender(Object o);
+}

http://git-wip-us.apache.org/repos/asf/logging-chainsaw/blob/deb3b3c0/src/main/java/org/apache/log4j/or/RendererMap.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/log4j/or/RendererMap.java b/src/main/java/org/apache/log4j/or/RendererMap.java
new file mode 100644
index 0000000..9d2de06
--- /dev/null
+++ b/src/main/java/org/apache/log4j/or/RendererMap.java
@@ -0,0 +1,199 @@
+/*
+ * 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.log4j.or;
+
+import org.apache.log4j.spi.RendererSupport;
+import org.apache.logging.log4j.core.util.OptionConverter;
+import org.apache.logging.log4j.status.StatusLogger;
+import org.apache.logging.log4j.util.LoaderUtil;
+
+import java.util.Hashtable;
+
+/**
+   Map class objects to an {@link ObjectRenderer}.
+
+   @author Ceki G&uuml;lc&uuml;
+   @since version 1.0 */
+public class RendererMap {
+
+  Hashtable map;
+
+  static ObjectRenderer defaultRenderer = new DefaultRenderer();
+
+  public RendererMap() {
+    map = new Hashtable();
+  }
+
+  /**
+     Add a renderer to a hierarchy passed as parameter.
+  */
+  static
+  public
+  void addRenderer(RendererSupport repository, String renderedClassName,
+                   String renderingClassName) {
+    StatusLogger.getLogger().debug("Rendering class: ["+renderingClassName+"], Rendered class: ["+
+		 renderedClassName+"].");
+    ObjectRenderer renderer = (ObjectRenderer)
+             OptionConverter.instantiateByClassName(renderingClassName,
+						    ObjectRenderer.class,
+						    null);
+    if(renderer == null) {
+      StatusLogger.getLogger().error("Could not instantiate renderer ["+renderingClassName+"].");
+      return;
+    } else {
+      try {
+	Class renderedClass = LoaderUtil.loadClass(renderedClassName);
+	repository.setRenderer(renderedClass, renderer);
+      } catch(ClassNotFoundException e) {
+	StatusLogger.getLogger().error("Could not find class ["+renderedClassName+"].", e);
+      }
+    }
+  }
+
+
+  /**
+     Find the appropriate renderer for the class type of the
+     <code>o</code> parameter. This is accomplished by calling the
+     {@link #get(Class)} method. Once a renderer is found, it is
+     applied on the object <code>o</code> and the result is returned
+     as a {@link String}. */
+  public
+  String findAndRender(Object o) {
+    if(o == null) {
+        return null;
+    } else {
+        return get(o.getClass()).doRender(o);
+    }
+  }
+
+
+  /**
+     Syntactic sugar method that calls {@link #get(Class)} with the
+     class of the object parameter. */
+  public ObjectRenderer get(Object o) {
+    if(o == null) {
+        return null;
+    } else {
+        return get(o.getClass());
+    }
+  }
+
+
+  /**
+     Search the parents of <code>clazz</code> for a renderer. The
+     renderer closest in the hierarchy will be returned. If no
+     renderers could be found, then the default renderer is returned.
+
+     <p>The search first looks for a renderer configured for
+     <code>clazz</code>. If a renderer could not be found, then the
+     search continues by looking at all the interfaces implemented by
+     <code>clazz</code> including the super-interfaces of each
+     interface.  If a renderer cannot be found, then the search looks
+     for a renderer defined for the parent (superclass) of
+     <code>clazz</code>. If that fails, then all the interfaces
+     implemented by the parent of <code>clazz</code> are searched and
+     so on.
+
+     <p>For example, if A0, A1, A2 are classes and X0, X1, X2, Y0, Y1
+     are interfaces where A2 extends A1 which in turn extends A0 and
+     similarly X2 extends X1 which extends X0 and Y1 extends Y0. Let
+     us also assume that A1 implements the Y0 interface and that A2
+     implements the X2 interface.
+
+     <p>The table below shows the results returned by the
+     <code>get(A2.class)</code> method depending on the renderers
+     added to the map.
+
+     <p><table border="1">
+     <tr><th>Added renderers</th><th>Value returned by <code>get(A2.class)</code></th>
+
+     <tr><td><code>A0Renderer</code>
+         <td align="center"><code>A0Renderer</code>
+
+     <tr><td><code>A0Renderer, A1Renderer</code>
+         <td align="center"><code>A1Renderer</code>
+
+     <tr><td><code>X0Renderer</code>
+         <td align="center"><code>X0Renderer</code>
+
+     <tr><td><code>A1Renderer, X0Renderer</code>
+         <td align="center"><code>X0Renderer</code>
+
+     </table>
+
+     <p>This search algorithm is not the most natural, although it is
+     particularly easy to implement. Future log4j versions
+     <em>may</em> implement a more intuitive search
+     algorithm. However, the present algorithm should be acceptable in
+     the vast majority of circumstances.
+
+ */
+  public ObjectRenderer get(Class clazz) {
+    //System.out.println("\nget: "+clazz);
+    ObjectRenderer r = null;
+    for(Class c = clazz; c != null; c = c.getSuperclass()) {
+      //System.out.println("Searching for class: "+c);
+      r = (ObjectRenderer) map.get(c);
+      if(r != null) {
+	return r;
+      }
+      r = searchInterfaces(c);
+      if(r != null) {
+        return r;
+    }
+    }
+    return defaultRenderer;
+  }
+
+  ObjectRenderer searchInterfaces(Class c) {
+    //System.out.println("Searching interfaces of class: "+c);
+
+    ObjectRenderer r = (ObjectRenderer) map.get(c);
+    if(r != null) {
+      return r;
+    } else {
+      Class[] ia = c.getInterfaces();
+      for(int i = 0; i < ia.length; i++) {
+	r = searchInterfaces(ia[i]);
+	if(r != null) {
+        return r;
+    }
+      }
+    }
+    return null;
+  }
+
+
+  public ObjectRenderer getDefaultRenderer() {
+    return defaultRenderer;
+  }
+
+
+  public
+  void clear() {
+    map.clear();
+  }
+
+  /**
+     Register an {@link ObjectRenderer} for <code>clazz</code>.
+  */
+  public
+  void put(Class clazz, ObjectRenderer or) {
+    map.put(clazz, or);
+  }
+}

http://git-wip-us.apache.org/repos/asf/logging-chainsaw/blob/deb3b3c0/src/main/java/org/apache/log4j/plugins/Plugin.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/log4j/plugins/Plugin.java b/src/main/java/org/apache/log4j/plugins/Plugin.java
index ca54665..26ff6ff 100644
--- a/src/main/java/org/apache/log4j/plugins/Plugin.java
+++ b/src/main/java/org/apache/log4j/plugins/Plugin.java
@@ -135,7 +135,7 @@ public interface Plugin extends OptionHandler {
      * is more work than is needed, so this simple method is used instead.</p>
      *
      * @param testPlugin The plugin to test equivalency against.
-     * @return Returns true if testPlugin is considered to be equivelent.
+     * @return Returns true if testPlugin is considered to be equivalent.
      */
     boolean isEquivalent(Plugin testPlugin);
 

http://git-wip-us.apache.org/repos/asf/logging-chainsaw/blob/deb3b3c0/src/main/java/org/apache/log4j/plugins/Receiver.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/log4j/plugins/Receiver.java b/src/main/java/org/apache/log4j/plugins/Receiver.java
index 39c31e0..331d71f 100644
--- a/src/main/java/org/apache/log4j/plugins/Receiver.java
+++ b/src/main/java/org/apache/log4j/plugins/Receiver.java
@@ -17,9 +17,9 @@
 
 package org.apache.log4j.plugins;
 
-import org.apache.log4j.Level;
-import org.apache.log4j.Logger;
-import org.apache.log4j.spi.LoggingEvent;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.Logger;
+import org.apache.logging.log4j.core.LogEvent;
 import org.apache.log4j.spi.Thresholdable;
 
 
@@ -70,7 +70,7 @@ public abstract class Receiver extends PluginSkeleton implements Thresholdable {
     }
 
     /**
-     * Sets the receiver theshold to the given level.
+     * Sets the receiver threshold to the given level.
      *
      * @param level The threshold level events must equal or be greater
      *              than before further processing can be done.
@@ -100,7 +100,7 @@ public abstract class Receiver extends PluginSkeleton implements Thresholdable {
      */
     public boolean isAsSevereAsThreshold(final Level level) {
         return ((thresholdLevel == null)
-                || level.isGreaterOrEqual(thresholdLevel));
+                || level.isLessSpecificThan(thresholdLevel));
     }
 
     /**
@@ -109,7 +109,7 @@ public abstract class Receiver extends PluginSkeleton implements Thresholdable {
      *
      * @param event the log event to post to the local log4j environment.
      */
-    public void doPost(final LoggingEvent event) {
+    public void doPost(final LogEvent event) {
         // if event does not meet threshold, exit now
         if (!isAsSevereAsThreshold(event.getLevel())) {
             return;
@@ -123,7 +123,7 @@ public abstract class Receiver extends PluginSkeleton implements Thresholdable {
         // if the logger level is greater or equal to the level
         // of the event, use the logger to append the event.
         if (event.getLevel()
-                .isGreaterOrEqual(localLogger.getEffectiveLevel())) {
+                .isLessSpecificThan(localLogger.getEffectiveLevel())) {
             // call the loggers appenders to process the event
             localLogger.callAppenders(event);
         }

http://git-wip-us.apache.org/repos/asf/logging-chainsaw/blob/deb3b3c0/src/main/java/org/apache/log4j/rewrite/MapRewritePolicy.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/log4j/rewrite/MapRewritePolicy.java b/src/main/java/org/apache/log4j/rewrite/MapRewritePolicy.java
deleted file mode 100644
index 4fca465..0000000
--- a/src/main/java/org/apache/log4j/rewrite/MapRewritePolicy.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * 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.log4j.rewrite;
-
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-import org.apache.log4j.Logger;
-import org.apache.log4j.spi.LoggingEvent;
-
-/**
- * This policy rewrites events where the message of the
- * original event implementes java.util.Map.
- * All other events are passed through unmodified.
- * If the map contains a "message" entry, the value will be
- * used as the message for the rewritten event.  The rewritten
- * event will have a property set that is the combination of the
- * original property set and the other members of the message map.
- * If both the original property set and the message map
- * contain the same entry, the value from the message map
- * will overwrite the original property set.
- *
- * The combination of the RewriteAppender and this policy
- * performs the same actions as the MapFilter from log4j 1.3. 
- */
-public class MapRewritePolicy implements RewritePolicy {
-    /**
-     * {@inheritDoc}
-     */
-    public LoggingEvent rewrite(final LoggingEvent source) {
-        Object msg = source.getMessage();
-        if (msg instanceof Map) {
-            Map props = new HashMap(source.getProperties());
-            Map eventProps = (Map) msg;
-            //
-            //   if the map sent in the logging request
-            //      has "message" entry, use that as the message body
-            //      otherwise, use the entire map.
-            //
-            Object newMsg = eventProps.get("message");
-            if (newMsg == null) {
-                newMsg = msg;
-            }
-
-            for(Iterator iter = eventProps.entrySet().iterator();
-                    iter.hasNext();
-                  ) {
-                Map.Entry entry = (Map.Entry) iter.next();
-                if (!("message".equals(entry.getKey()))) {
-                    props.put(entry.getKey(), entry.getValue());
-                }
-            }
-
-            return new LoggingEvent(
-                    source.getFQNOfLoggerClass(),
-                    source.getLogger() != null ? source.getLogger(): Logger.getLogger(source.getLoggerName()), 
-                    source.getTimeStamp(),
-                    source.getLevel(),
-                    newMsg,
-                    source.getThreadName(),
-                    source.getThrowableInformation(),
-                    source.getNDC(),
-                    source.getLocationInformation(),
-                    props);
-        } else {
-            return source;
-        }
-
-    }
-}

http://git-wip-us.apache.org/repos/asf/logging-chainsaw/blob/deb3b3c0/src/main/java/org/apache/log4j/rewrite/PropertyRewritePolicy.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/log4j/rewrite/PropertyRewritePolicy.java b/src/main/java/org/apache/log4j/rewrite/PropertyRewritePolicy.java
deleted file mode 100644
index 535736c..0000000
--- a/src/main/java/org/apache/log4j/rewrite/PropertyRewritePolicy.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * 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.log4j.rewrite;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.StringTokenizer;
-
-import org.apache.log4j.Logger;
-import org.apache.log4j.spi.LoggingEvent;
-
-/**
- * This policy rewrites events by adding
- * a user-specified list of properties to the event.
- * Existing properties are not modified.
- *
- * The combination of the RewriteAppender and this policy
- * performs the same actions as the PropertyFilter from log4j 1.3.
- */
-
-public class PropertyRewritePolicy implements RewritePolicy {
-    private Map properties = Collections.EMPTY_MAP;
-    public PropertyRewritePolicy() {
-    }
-
-    /**
-     * Set a string representing the property name/value pairs.
-     * 
-     * Form: propname1=propvalue1,propname2=propvalue2
-     * 
-     * @param props
-     */
-    public void setProperties(String props) {
-        Map hashTable = new HashMap();
-        StringTokenizer pairs = new StringTokenizer(props, ",");
-        while (pairs.hasMoreTokens()) {
-            StringTokenizer entry = new StringTokenizer(pairs.nextToken(), "=");
-            hashTable.put(entry.nextElement().toString().trim(), entry.nextElement().toString().trim());
-        }
-        synchronized(this) {
-            properties = hashTable;
-        }
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public LoggingEvent rewrite(final LoggingEvent source) {
-        if (!properties.isEmpty()) {
-            Map rewriteProps = new HashMap(source.getProperties());
-            for(Iterator iter = properties.entrySet().iterator();
-                    iter.hasNext();
-                    ) {
-                Map.Entry entry = (Map.Entry) iter.next();
-                if (!rewriteProps.containsKey(entry.getKey())) {
-                    rewriteProps.put(entry.getKey(), entry.getValue());
-                }
-            }
-
-            return new LoggingEvent(
-                    source.getFQNOfLoggerClass(),
-                    source.getLogger() != null ? source.getLogger(): Logger.getLogger(source.getLoggerName()), 
-                    source.getTimeStamp(),
-                    source.getLevel(),
-                    source.getMessage(),
-                    source.getThreadName(),
-                    source.getThrowableInformation(),
-                    source.getNDC(),
-                    source.getLocationInformation(),
-                    rewriteProps);
-        }
-        return source;
-    }
-
-
-
-}

http://git-wip-us.apache.org/repos/asf/logging-chainsaw/blob/deb3b3c0/src/main/java/org/apache/log4j/rewrite/ReflectionRewritePolicy.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/log4j/rewrite/ReflectionRewritePolicy.java b/src/main/java/org/apache/log4j/rewrite/ReflectionRewritePolicy.java
deleted file mode 100644
index f1a4cc5..0000000
--- a/src/main/java/org/apache/log4j/rewrite/ReflectionRewritePolicy.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * 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.log4j.rewrite;
-
-import java.beans.Introspector;
-import java.beans.PropertyDescriptor;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.apache.log4j.Logger;
-import org.apache.log4j.helpers.LogLog;
-import org.apache.log4j.spi.LoggingEvent;
-
-/**
- * This policy rewrites events by evaluating any
- * JavaBean properties on the message object and adding them
- * to the event properties.  If the message object has a
- * message property, the value of that property will be
- * used as the message for the rewritten event and will
- * not be added to the event properties.  Values from the
- * JavaBean properties will replace any existing property
- * with the same name.
- *
- * The combination of the RewriteAppender and this policy
- * performs the same actions as the ReflectionFilter from log4j 1.3. 
- */
-public class ReflectionRewritePolicy implements RewritePolicy {
-    /**
-     * {@inheritDoc}
-     */
-    public LoggingEvent rewrite(final LoggingEvent source) {
-        Object msg = source.getMessage();
-        if (!(msg instanceof String)) {
-            Object newMsg = msg;
-            Map rewriteProps = new HashMap(source.getProperties());
-
-            try {
-                PropertyDescriptor[] props = Introspector.getBeanInfo(
-                        msg.getClass(), Object.class).getPropertyDescriptors();
-                if (props.length > 0) {
-                    for (int i=0;i<props.length;i++) {
-                        try {
-                            Object propertyValue =
-                                props[i].getReadMethod().invoke(msg,
-                                        (Object[]) null);
-                            if ("message".equalsIgnoreCase(props[i].getName())) {
-                                newMsg = propertyValue;
-                            } else {
-                                rewriteProps.put(props[i].getName(), propertyValue);
-                            }
-                        } catch (Exception e) {
-                            LogLog.warn("Unable to evaluate property " +
-                                    props[i].getName(), e);
-                        }
-                    }
-                    return new LoggingEvent(
-                            source.getFQNOfLoggerClass(),
-                            source.getLogger() != null ? source.getLogger(): Logger.getLogger(source.getLoggerName()),
-                            source.getTimeStamp(),
-                            source.getLevel(),
-                            newMsg,
-                            source.getThreadName(),
-                            source.getThrowableInformation(),
-                            source.getNDC(),
-                            source.getLocationInformation(),
-                            rewriteProps);
-                }
-            } catch (Exception e) {
-                LogLog.warn("Unable to get property descriptors", e);
-            }
-
-        }
-        return source;
-    }
-}

http://git-wip-us.apache.org/repos/asf/logging-chainsaw/blob/deb3b3c0/src/main/java/org/apache/log4j/rewrite/RewriteAppender.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/log4j/rewrite/RewriteAppender.java b/src/main/java/org/apache/log4j/rewrite/RewriteAppender.java
deleted file mode 100644
index 368ecf9..0000000
--- a/src/main/java/org/apache/log4j/rewrite/RewriteAppender.java
+++ /dev/null
@@ -1,199 +0,0 @@
-/*
- * 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.log4j.rewrite;
-
-import org.apache.log4j.Appender;
-import org.apache.log4j.AppenderSkeleton;
-import org.apache.log4j.helpers.AppenderAttachableImpl;
-import org.apache.log4j.spi.AppenderAttachable;
-import org.apache.log4j.spi.LoggingEvent;
-import org.apache.log4j.spi.OptionHandler;
-import org.apache.log4j.xml.UnrecognizedElementHandler;
-import org.w3c.dom.Element;
-
-import java.util.Enumeration;
-import java.util.Properties;
-
-/**
- * This appender forwards a logging request to another
- * appender after possibly rewriting the logging event.
- *
- * This appender (with the appropriate policy)
- * replaces the MapFilter, PropertyFilter and ReflectionFilter
- * from log4j 1.3.
- */
-public class RewriteAppender extends AppenderSkeleton
-     implements AppenderAttachable, UnrecognizedElementHandler {
-    /**
-     * Rewrite policy.
-     */
-    private RewritePolicy policy;
-    /**
-     * Nested appenders.
-     */
-    private final AppenderAttachableImpl appenders;
-
-    public RewriteAppender() {
-        appenders = new AppenderAttachableImpl();
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    protected void append(final LoggingEvent event) {
-        LoggingEvent rewritten = event;
-        if (policy != null) {
-            rewritten = policy.rewrite(event);
-        }
-        if (rewritten != null) {
-            synchronized (appenders) {
-              appenders.appendLoopOnAppenders(rewritten);
-            }
-        }
-    }
-
-    /**
-     * Add appender.
-     *
-     * @param newAppender appender to add, may not be null.
-     */
-    public void addAppender(final Appender newAppender) {
-      synchronized (appenders) {
-        appenders.addAppender(newAppender);
-      }
-    }
-
-    /**
-     * Get iterator over attached appenders.
-     * @return iterator or null if no attached appenders.
-     */
-    public Enumeration getAllAppenders() {
-      synchronized (appenders) {
-        return appenders.getAllAppenders();
-      }
-    }
-
-    /**
-     * Get appender by name.
-     *
-     * @param name name, may not be null.
-     * @return matching appender or null.
-     */
-    public Appender getAppender(final String name) {
-      synchronized (appenders) {
-        return appenders.getAppender(name);
-      }
-    }
-
-
-    /**
-     * Close this <code>AsyncAppender</code> by interrupting the dispatcher
-     * thread which will process all pending events before exiting.
-     */
-    public void close() {
-      closed = true;
-      //
-      //    close all attached appenders.
-      //
-      synchronized (appenders) {
-        Enumeration iter = appenders.getAllAppenders();
-
-        if (iter != null) {
-          while (iter.hasMoreElements()) {
-            Object next = iter.nextElement();
-
-            if (next instanceof Appender) {
-              ((Appender) next).close();
-            }
-          }
-        }
-      }
-    }
-
-    /**
-     * Determines if specified appender is attached.
-     * @param appender appender.
-     * @return true if attached.
-     */
-    public boolean isAttached(final Appender appender) {
-      synchronized (appenders) {
-        return appenders.isAttached(appender);
-      }
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public boolean requiresLayout() {
-      return false;
-    }
-
-    /**
-     * Removes and closes all attached appenders.
-     */
-    public void removeAllAppenders() {
-      synchronized (appenders) {
-        appenders.removeAllAppenders();
-      }
-    }
-
-    /**
-     * Removes an appender.
-     * @param appender appender to remove.
-     */
-    public void removeAppender(final Appender appender) {
-      synchronized (appenders) {
-        appenders.removeAppender(appender);
-      }
-    }
-
-    /**
-     * Remove appender by name.
-     * @param name name.
-     */
-    public void removeAppender(final String name) {
-      synchronized (appenders) {
-        appenders.removeAppender(name);
-      }
-    }
-
-
-    public void setRewritePolicy(final RewritePolicy rewritePolicy) {
-        policy = rewritePolicy;
-    }
-    /**
-     * {@inheritDoc}
-     */
-    public boolean parseUnrecognizedElement(final Element element,
-                                            final Properties props) throws Exception {
-        final String nodeName = element.getNodeName();
-        if ("rewritePolicy".equals(nodeName)) {
-            Object rewritePolicy =
-                    org.apache.log4j.xml.DOMConfigurator.parseElement(
-                            element, props, RewritePolicy.class);
-            if (rewritePolicy != null) {
-                if (rewritePolicy instanceof OptionHandler) {
-                    ((OptionHandler) rewritePolicy).activateOptions();
-                }
-                this.setRewritePolicy((RewritePolicy) rewritePolicy);
-            }
-            return true;
-        }
-        return false;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/logging-chainsaw/blob/deb3b3c0/src/main/java/org/apache/log4j/rewrite/RewritePolicy.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/log4j/rewrite/RewritePolicy.java b/src/main/java/org/apache/log4j/rewrite/RewritePolicy.java
deleted file mode 100644
index bb40507..0000000
--- a/src/main/java/org/apache/log4j/rewrite/RewritePolicy.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package org.apache.log4j.rewrite;
-
-import org.apache.log4j.spi.LoggingEvent;
-
-/*
-* 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.
-*/
-
-/**
- * This interface is implemented to provide a rewrite
- * strategy for RewriteAppender.  RewriteAppender will
- * call the rewrite method with a source logging event.
- * The strategy may return that event, create a new event
- * or return null to suppress the logging request.
- */
-public interface RewritePolicy {
-    /**
-     * Rewrite a logging event.
-     * @param source a logging event that may be returned or
-     * used to create a new logging event.
-     * @return a logging event or null to suppress processing.
-     */
-    LoggingEvent rewrite(final LoggingEvent source);
-}

http://git-wip-us.apache.org/repos/asf/logging-chainsaw/blob/deb3b3c0/src/main/java/org/apache/log4j/spi/ComponentBase.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/log4j/spi/ComponentBase.java b/src/main/java/org/apache/log4j/spi/ComponentBase.java
index 77ba7cf..03436f2 100644
--- a/src/main/java/org/apache/log4j/spi/ComponentBase.java
+++ b/src/main/java/org/apache/log4j/spi/ComponentBase.java
@@ -17,7 +17,7 @@
 package org.apache.log4j.spi;
 
 import org.apache.log4j.ULogger;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
 
 
 /**

http://git-wip-us.apache.org/repos/asf/logging-chainsaw/blob/deb3b3c0/src/main/java/org/apache/log4j/spi/Decoder.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/log4j/spi/Decoder.java b/src/main/java/org/apache/log4j/spi/Decoder.java
index d4686ad..f49e482 100644
--- a/src/main/java/org/apache/log4j/spi/Decoder.java
+++ b/src/main/java/org/apache/log4j/spi/Decoder.java
@@ -18,6 +18,8 @@
 package org.apache.log4j.spi;
 
 
+import org.apache.logging.log4j.core.LogEvent;
+
 import java.io.IOException;
 
 import java.net.URL;
@@ -38,26 +40,26 @@ public interface Decoder {
      * @param document document to decode.
      * @return list of LoggingEvent instances.
      */
-  Vector decodeEvents(String document);
+  Vector<LogEvent> decodeEvents(String document);
 
     /**
      * Decode event from string.
      * @param event string representation of event
      * @return event
      */
-  LoggingEvent decode(String event);
+  LogEvent decode(String event);
 
     /**
-     * Decode event from document retreived from URL.
+     * Decode event from document retrieved from URL.
      * @param url url of document
      * @return list of LoggingEvent instances.
      * @throws IOException if IO error resolving document.
      */
-  Vector decode(URL url) throws IOException;
+  Vector<LogEvent> decode(URL url) throws IOException;
 
     /**
      * Sets additional properties.
      * @param additionalProperties map of additional properties.
      */
-  void setAdditionalProperties(Map additionalProperties);
+  void setAdditionalProperties(Map<String, String> additionalProperties);
 }

http://git-wip-us.apache.org/repos/asf/logging-chainsaw/blob/deb3b3c0/src/main/java/org/apache/log4j/spi/HierarchyEventListener.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/log4j/spi/HierarchyEventListener.java b/src/main/java/org/apache/log4j/spi/HierarchyEventListener.java
new file mode 100644
index 0000000..841abf8
--- /dev/null
+++ b/src/main/java/org/apache/log4j/spi/HierarchyEventListener.java
@@ -0,0 +1,36 @@
+/*
+ * 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.log4j.spi;
+
+import org.apache.logging.log4j.core.Appender;
+import org.apache.logging.log4j.Logger;
+
+/**
+   Listen to events occurring within a Hierarchy.
+
+   @author Ceki G&uuml;lc&uuml;
+   @since 1.2
+   
+ */
+public interface HierarchyEventListener {
+
+  void addAppenderEvent(Logger logger, Appender appender);
+
+  void removeAppenderEvent(Logger logger, Appender appender);
+
+}

http://git-wip-us.apache.org/repos/asf/logging-chainsaw/blob/deb3b3c0/src/main/java/org/apache/log4j/spi/Log4JULogger.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/log4j/spi/Log4JULogger.java b/src/main/java/org/apache/log4j/spi/Log4JULogger.java
index 2476810..75ae328 100644
--- a/src/main/java/org/apache/log4j/spi/Log4JULogger.java
+++ b/src/main/java/org/apache/log4j/spi/Log4JULogger.java
@@ -16,10 +16,10 @@
  */
 package org.apache.log4j.spi;
 
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
+import org.apache.logging.log4j.Level;
 import org.apache.log4j.ULogger;
 import org.apache.log4j.helpers.MessageFormatter;
-import org.apache.log4j.Level;
 
 
 /**
@@ -142,7 +142,7 @@ public final class Log4JULogger implements ULogger {
      * {@inheritDoc}
      */
     public boolean isWarnEnabled() {
-        return logger.isEnabledFor(Level.WARN);
+        return logger.isEnabled(Level.WARN);
     }
 
     /**
@@ -157,7 +157,7 @@ public final class Log4JULogger implements ULogger {
      */
     public void warn(final Object parameterizedMsg,
                      final Object param1) {
-        if (logger.isEnabledFor(Level.WARN)) {
+        if (logger.isEnabled(Level.WARN)) {
             logger.warn(MessageFormatter.format(
                     parameterizedMsg.toString(), param1));
         }
@@ -169,7 +169,7 @@ public final class Log4JULogger implements ULogger {
     public void warn(final String parameterizedMsg,
                      final Object param1,
                      final Object param2) {
-        if (logger.isEnabledFor(Level.WARN)) {
+        if (logger.isEnabled(Level.WARN)) {
             logger.warn(MessageFormatter.format(
                     parameterizedMsg.toString(), param1, param2));
         }
@@ -186,7 +186,7 @@ public final class Log4JULogger implements ULogger {
      * {@inheritDoc}
      */
     public boolean isErrorEnabled() {
-        return logger.isEnabledFor(Level.ERROR);
+        return logger.isEnabled(Level.ERROR);
     }
 
     /**
@@ -201,7 +201,7 @@ public final class Log4JULogger implements ULogger {
      * {@inheritDoc}
      */
     public void error(final Object parameterizedMsg, final Object param1) {
-        if (logger.isEnabledFor(Level.ERROR)) {
+        if (logger.isEnabled(Level.ERROR)) {
             logger.error(MessageFormatter.format(
                     parameterizedMsg.toString(), param1));
         }
@@ -213,7 +213,7 @@ public final class Log4JULogger implements ULogger {
     public void error(final String parameterizedMsg,
                       final Object param1,
                       final Object param2) {
-        if (logger.isEnabledFor(Level.ERROR)) {
+        if (logger.isEnabled(Level.ERROR)) {
             logger.error(MessageFormatter.format(
                     parameterizedMsg.toString(), param1, param2));
         }

http://git-wip-us.apache.org/repos/asf/logging-chainsaw/blob/deb3b3c0/src/main/java/org/apache/log4j/spi/LoggerEventListener.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/log4j/spi/LoggerEventListener.java b/src/main/java/org/apache/log4j/spi/LoggerEventListener.java
index b39f728..2c95502 100644
--- a/src/main/java/org/apache/log4j/spi/LoggerEventListener.java
+++ b/src/main/java/org/apache/log4j/spi/LoggerEventListener.java
@@ -17,8 +17,8 @@
 
 package org.apache.log4j.spi;
 
-import org.apache.log4j.Appender;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.core.Appender;
+import org.apache.logging.log4j.Logger;
 
 
 /**

http://git-wip-us.apache.org/repos/asf/logging-chainsaw/blob/deb3b3c0/src/main/java/org/apache/log4j/spi/LoggerFactory.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/log4j/spi/LoggerFactory.java b/src/main/java/org/apache/log4j/spi/LoggerFactory.java
new file mode 100644
index 0000000..6c06f24
--- /dev/null
+++ b/src/main/java/org/apache/log4j/spi/LoggerFactory.java
@@ -0,0 +1,35 @@
+/*
+ * 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.log4j.spi;
+
+import org.apache.logging.log4j.Logger;
+
+/**
+   
+  Implement this interface to create new instances of Logger or
+  a sub-class of Logger.
+
+  @author Ceki G&uuml;lc&uuml;
+  @since version 0.8.5
+   
+ */
+public interface LoggerFactory {
+
+  Logger makeNewLoggerInstance(String name);
+
+}

http://git-wip-us.apache.org/repos/asf/logging-chainsaw/blob/deb3b3c0/src/main/java/org/apache/log4j/spi/LoggerRepository.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/log4j/spi/LoggerRepository.java b/src/main/java/org/apache/log4j/spi/LoggerRepository.java
new file mode 100644
index 0000000..ad7df75
--- /dev/null
+++ b/src/main/java/org/apache/log4j/spi/LoggerRepository.java
@@ -0,0 +1,88 @@
+/*
+ * 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.log4j.spi;
+
+import org.apache.logging.log4j.core.Appender;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.Logger;
+
+import java.util.Enumeration;
+import java.util.Locale;
+
+/**
+   A <code>LoggerRepository</code> is used to create and retrieve
+   <code>Loggers</code>. The relation between loggers in a repository
+   depends on the repository but typically loggers are arranged in a
+   named hierarchy.
+
+   <p>In addition to the creational methods, a
+   <code>LoggerRepository</code> can be queried for existing loggers,
+   can act as a point of registry for events related to loggers.
+
+   @author Ceki G&uuml;lc&uuml;
+   @since 1.2 */
+public interface LoggerRepository {
+
+  /**
+     Add a {@link HierarchyEventListener} event to the repository.
+  */
+  void addHierarchyEventListener(HierarchyEventListener listener);
+
+  /**
+     Returns whether this repository is disabled for a given
+     level. The answer depends on the repository threshold and the
+     <code>level</code> parameter. See also {@link #setThreshold}
+     method.  */
+  boolean isDisabled(int level);
+
+  /**
+     Set the repository-wide threshold. All logging requests below the
+     threshold are immediately dropped. By default, the threshold is
+     set to <code>Level.ALL</code> which has the lowest possible rank.  */
+  void setThreshold(Level level);
+
+  /**
+      Another form of {@link #setThreshold(Level)} accepting a string
+      parameter instead of a <code>Level</code>. */
+  void setThreshold(String val);
+
+
+  void emitNoAppenderWarning(Locale.Category cat);
+
+  /**
+     Get the repository-wide threshold. See {@link
+     #setThreshold(Level)} for an explanation. */
+  Level getThreshold();
+
+  Logger getLogger(String name);
+
+  Logger getLogger(String name, LoggerFactory factory);
+
+  Logger getRootLogger();
+
+  Logger exists(String name);
+
+  void shutdown();
+
+  Enumeration<Logger> getCurrentLoggers();
+
+  void fireAddAppenderEvent(Logger logger, Appender appender);
+
+  void resetConfiguration();
+
+}

http://git-wip-us.apache.org/repos/asf/logging-chainsaw/blob/deb3b3c0/src/main/java/org/apache/log4j/spi/LoggerRepositoryEx.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/log4j/spi/LoggerRepositoryEx.java b/src/main/java/org/apache/log4j/spi/LoggerRepositoryEx.java
index c079a2c..8a5cb40 100644
--- a/src/main/java/org/apache/log4j/spi/LoggerRepositoryEx.java
+++ b/src/main/java/org/apache/log4j/spi/LoggerRepositoryEx.java
@@ -17,9 +17,8 @@
 
 package org.apache.log4j.spi;
 
-import org.apache.log4j.Appender;
-import org.apache.log4j.Category;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.core.Appender;
+import org.apache.logging.log4j.Logger;
 import org.apache.log4j.plugins.PluginRegistry;
 import org.apache.log4j.scheduler.Scheduler;
 
@@ -103,7 +102,7 @@ public interface LoggerRepositoryEx extends LoggerRepository {
     @param logger The logger from which the appender was removed.
     @param appender The appender removed from the logger.
     */
-  void fireRemoveAppenderEvent(Category logger, Appender appender);
+  void fireRemoveAppenderEvent(Logger logger, Appender appender);
 
   /**
     Requests that a level changed event be sent to any registered
@@ -119,7 +118,7 @@ public interface LoggerRepositoryEx extends LoggerRepository {
   void fireConfigurationChangedEvent();
 
   /**
-   * Return the PluginRegisty for this LoggerRepository.
+   * Return the PluginRegistry for this LoggerRepository.
    * @return plug in registry.
    */
   PluginRegistry getPluginRegistry();

http://git-wip-us.apache.org/repos/asf/logging-chainsaw/blob/deb3b3c0/src/main/java/org/apache/log4j/spi/OptionHandler.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/log4j/spi/OptionHandler.java b/src/main/java/org/apache/log4j/spi/OptionHandler.java
new file mode 100644
index 0000000..2c90226
--- /dev/null
+++ b/src/main/java/org/apache/log4j/spi/OptionHandler.java
@@ -0,0 +1,62 @@
+/*
+ * 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.log4j.spi;
+
+
+/**
+   A string based interface to configure package components.
+
+   @author Ceki G&uuml;lc&uuml;
+   @author Anders Kristensen
+   @since 0.8.1
+ */
+public interface OptionHandler {
+
+  /**
+     Activate the options that were previously set with calls to option
+     setters.
+
+     <p>This allows to defer activiation of the options until all
+     options have been set. This is required for components which have
+     related options that remain ambigous until all are set.
+
+     <p>For example, the FileAppender has the {@link
+     org.apache.log4j.FileAppender#setFile File} and {@link
+     org.apache.log4j.FileAppender#setAppend Append} options both of
+     which are ambigous until the other is also set.  */
+  void activateOptions();
+
+  /**
+     Return list of strings that the OptionHandler instance recognizes.
+
+     @deprecated We now use JavaBeans style getters/setters.
+   */
+  //  String[] getOptionStrings();
+
+  /**
+     Set <code>option</code> to <code>value</code>.
+
+     <p>The handling of each option depends on the OptionHandler
+     instance. Some options may become active immediately whereas
+     other may be activated only when {@link #activateOptions} is
+     called.
+
+     @deprecated We now use JavaBeans style getters/setters.
+  */
+  //void setOption(String option, String value);
+}


[3/4] logging-chainsaw git commit: Try to upgrade to Log4j 2

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/logging-chainsaw/blob/deb3b3c0/src/main/java/org/apache/log4j/chainsaw/LogPanel.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/log4j/chainsaw/LogPanel.java b/src/main/java/org/apache/log4j/chainsaw/LogPanel.java
index 6fe2a8b..4c092e4 100644
--- a/src/main/java/org/apache/log4j/chainsaw/LogPanel.java
+++ b/src/main/java/org/apache/log4j/chainsaw/LogPanel.java
@@ -338,10 +338,8 @@ public class LogPanel extends DockablePanel implements EventBatchListener, Profi
                     getActionMap().put("ESCAPE", closeLogPanelPreferencesFrameAction);
 
 
-    setDetailPaneConversionPattern(
-      DefaultLayoutFactory.getDefaultPatternLayout());
-      detailLayout.setConversionPattern(
-      DefaultLayoutFactory.getDefaultPatternLayout());
+    setDetailPaneConversionPattern(DefaultLayoutFactory.getDefaultPatternLayout());
+    detailLayout.setConversionPattern(DefaultLayoutFactory.getDefaultPatternLayout());
 
     undockedFrame = new JFrame(identifier);
     undockedFrame.setDefaultCloseOperation(
@@ -826,15 +824,15 @@ public class LogPanel extends DockablePanel implements EventBatchListener, Profi
       new PropertyChangeListener() {
         public void propertyChange(PropertyChangeEvent evt) {
           for (Iterator iter = tableModel.getAllEvents().iterator();iter.hasNext();) {
-            LoggingEventWrapper loggingEventWrapper = (LoggingEventWrapper)iter.next();
-            loggingEventWrapper.updateColorRuleColors(colorizer.getBackgroundColor(loggingEventWrapper.getLoggingEvent()), colorizer.getForegroundColor(loggingEventWrapper.getLoggingEvent()));
+            LogEventWrapper logEventWrapper = (LogEventWrapper)iter.next();
+            logEventWrapper.updateColorRuleColors(colorizer.getBackgroundColor(logEventWrapper.getLogEvent()), colorizer.getForegroundColor(logEventWrapper.getLogEvent()));
           }
 //          no need to update searchmodel events since tablemodel and searchmodel share all events, and color rules aren't different between the two
 //          if that changes, un-do the color syncing in loggingeventwrapper & re-enable this code
 //
 //          for (Iterator iter = searchModel.getAllEvents().iterator();iter.hasNext();) {
 //             LoggingEventWrapper loggingEventWrapper = (LoggingEventWrapper)iter.next();
-//             loggingEventWrapper.updateColorRuleColors(colorizer.getBackgroundColor(loggingEventWrapper.getLoggingEvent()), colorizer.getForegroundColor(loggingEventWrapper.getLoggingEvent()));
+//             loggingEventWrapper.updateColorRuleColors(colorizer.getBackgroundColor(loggingEventWrapper.getLogEvent()), colorizer.getForegroundColor(loggingEventWrapper.getLogEvent()));
 //           }
           colorizedEventAndSearchMatchThumbnail.configureColors();
           lowerPanel.revalidate();
@@ -982,9 +980,9 @@ public class LogPanel extends DockablePanel implements EventBatchListener, Profi
     //select a row in the main table when a row in the search table is selected
     searchTable.addMouseListener(new MouseAdapter() {
       public void mouseClicked(MouseEvent e) {
-        LoggingEventWrapper loggingEventWrapper = searchModel.getRow(searchTable.getSelectedRow());
-        if (loggingEventWrapper != null) {
-          int id = new Integer(loggingEventWrapper.getLoggingEvent().getProperty("log4jid")).intValue();
+        LogEventWrapper logEventWrapper = searchModel.getRow(searchTable.getSelectedRow());
+        if (logEventWrapper != null) {
+          int id = new Integer(logEventWrapper.getLogEvent().getProperty("log4jid")).intValue();
           //preserve the table's viewble column
           setSelectedEvent(id);
         }
@@ -1031,7 +1029,7 @@ public class LogPanel extends DockablePanel implements EventBatchListener, Profi
     //refilter with a newValue of FALSE means refiltering is complete
     //assuming notification is called on the EDT so we can in the current EDT call update the scroll & selection
     tableModel.addPropertyChangeListener("refilter", new PropertyChangeListener() {
-        private LoggingEventWrapper currentEvent;
+        private LogEventWrapper currentEvent;
         public void propertyChange(PropertyChangeEvent evt) {
             //if new value is true, filtering is about to begin
             //if new value is false, filtering is complete
@@ -1789,10 +1787,10 @@ public class LogPanel extends DockablePanel implements EventBatchListener, Profi
             if (currentPoint != null) {
               int row = currentTable.rowAtPoint(currentPoint);
               ChainsawCyclicBufferTableModel cyclicBufferTableModel = (ChainsawCyclicBufferTableModel) currentTable.getModel();
-              LoggingEventWrapper loggingEventWrapper = cyclicBufferTableModel.getRow(row);
-              if (loggingEventWrapper != null)
+              LogEventWrapper logEventWrapper = cyclicBufferTableModel.getRow(row);
+              if (logEventWrapper != null)
               {
-                  ((TableColorizingRenderer)currentTable.getDefaultRenderer(Object.class)).setUseRelativeTimes(loggingEventWrapper.getLoggingEvent().getTimeStamp());
+                  ((TableColorizingRenderer)currentTable.getDefaultRenderer(Object.class)).setUseRelativeTimes(logEventWrapper.getLogEvent().getTimeStamp());
                   cyclicBufferTableModel.reFilter();
               }
               setEnabled(true);
@@ -1954,8 +1952,8 @@ public class LogPanel extends DockablePanel implements EventBatchListener, Profi
           //exception - build message + throwable
           String[] ti = (String[])o;
             if (ti.length > 0 && (!(ti.length == 1 && ti[0].equals("")))) {
-              LoggingEventWrapper loggingEventWrapper = ((ChainsawCyclicBufferTableModel)(currentTable.getModel())).getRow(row);
-              value = loggingEventWrapper.getLoggingEvent().getMessage().toString();
+              LogEventWrapper logEventWrapper = ((ChainsawCyclicBufferTableModel)(currentTable.getModel())).getRow(row);
+              value = logEventWrapper.getLogEvent().getMessage().toString();
               for (int i=0;i<((String[])o).length;i++) {
                   value = value + "\n" + ((String[]) o)[i];
               }
@@ -2136,7 +2134,7 @@ public class LogPanel extends DockablePanel implements EventBatchListener, Profi
         }
         final int selectedRow = table.getSelectedRow();
         final int startingRow = table.getRowCount();
-        final LoggingEventWrapper selectedEvent;
+        final LogEventWrapper selectedEvent;
         if (selectedRow >= 0) {
           selectedEvent = tableModel.getRow(selectedRow);
         } else {
@@ -2155,7 +2153,7 @@ public class LogPanel extends DockablePanel implements EventBatchListener, Profi
           //these are actual LoggingEvent instances
           LoggingEvent event = (LoggingEvent)iter.next();
           //create two separate loggingEventWrappers (main table and search table), as they have different info on display state
-          LoggingEventWrapper loggingEventWrapper1 = new LoggingEventWrapper(event);
+          LogEventWrapper logEventWrapper1 = new LogEventWrapper(event);
             //if the clearTableExpressionRule is not null, evaluate & clear the table if it matches
             if (clearTableExpressionRule != null && clearTableExpressionRule.evaluate(event, null)) {
                 logger.info("clear table expression matched - clearing table - matching event msg - " + event.getMessage());
@@ -2163,15 +2161,15 @@ public class LogPanel extends DockablePanel implements EventBatchListener, Profi
             }
 
           updateOtherModels(event);
-          boolean isCurrentRowAdded = tableModel.isAddRow(loggingEventWrapper1);
+          boolean isCurrentRowAdded = tableModel.isAddRow(logEventWrapper1);
           if (isCurrentRowAdded) {
               addedRowCount++;
           }
           rowAdded = rowAdded || isCurrentRowAdded;
 
           //create a new loggingEventWrapper via copy constructor to ensure same IDs
-          LoggingEventWrapper loggingEventWrapper2 = new LoggingEventWrapper(loggingEventWrapper1);
-          boolean isSearchCurrentRowAdded = searchModel.isAddRow(loggingEventWrapper2);
+          LogEventWrapper logEventWrapper2 = new LogEventWrapper(logEventWrapper1);
+          boolean isSearchCurrentRowAdded = searchModel.isAddRow(logEventWrapper2);
           if (isSearchCurrentRowAdded) {
               searchAddedRowCount++;
           }
@@ -2979,7 +2977,7 @@ public class LogPanel extends DockablePanel implements EventBatchListener, Profi
    */
   private void setDetailPaneConversionPattern(String conversionPattern) {
     String oldPattern = getDetailPaneConversionPattern();
-    (detailLayout).setConversionPattern(conversionPattern);
+    detailLayout.setConversionPattern(conversionPattern);
     firePropertyChange(
       "detailPaneConversionPattern", oldPattern,
       getDetailPaneConversionPattern());
@@ -2991,7 +2989,7 @@ public class LogPanel extends DockablePanel implements EventBatchListener, Profi
    * @return conversionPattern layout text
    */
   private String getDetailPaneConversionPattern() {
-    return (detailLayout).getConversionPattern();
+    return detailLayout.getConversionPattern();
   }
 
   /**
@@ -3247,9 +3245,9 @@ public class LogPanel extends DockablePanel implements EventBatchListener, Profi
     return longestWidth + 5;
   }
 
-  private String getToolTipTextForEvent(LoggingEventWrapper loggingEventWrapper) {
+  private String getToolTipTextForEvent(LogEventWrapper logEventWrapper) {
     StringBuffer buf = new StringBuffer();
-    buf.append(detailLayout.getHeader()).append(detailLayout.format(loggingEventWrapper.getLoggingEvent())).append(detailLayout.getFooter());
+    buf.append(detailLayout.getHeader()).append(detailLayout.format(logEventWrapper.getLogEvent())).append(detailLayout.getFooter());
     return buf.toString();
   }
 
@@ -3311,13 +3309,13 @@ public class LogPanel extends DockablePanel implements EventBatchListener, Profi
     public void toggleMarker() {
         int row = table.getSelectedRow();
         if (row != -1) {
-          LoggingEventWrapper loggingEventWrapper = tableModel.getRow(row);
-          if (loggingEventWrapper != null) {
-              Object marker = loggingEventWrapper.getLoggingEvent().getProperty(ChainsawConstants.LOG4J_MARKER_COL_NAME_LOWERCASE);
+          LogEventWrapper logEventWrapper = tableModel.getRow(row);
+          if (logEventWrapper != null) {
+              Object marker = logEventWrapper.getLogEvent().getProperty(ChainsawConstants.LOG4J_MARKER_COL_NAME_LOWERCASE);
               if (marker == null) {
-                  loggingEventWrapper.setProperty(ChainsawConstants.LOG4J_MARKER_COL_NAME_LOWERCASE, "set");
+                  logEventWrapper.setProperty(ChainsawConstants.LOG4J_MARKER_COL_NAME_LOWERCASE, "set");
               } else {
-                  loggingEventWrapper.removeProperty(ChainsawConstants.LOG4J_MARKER_COL_NAME_LOWERCASE);
+                  logEventWrapper.removeProperty(ChainsawConstants.LOG4J_MARKER_COL_NAME_LOWERCASE);
               }
               //if marker -was- null, it no longer is (may need to add the column)
               tableModel.fireRowUpdated(row, (marker == null));
@@ -3499,17 +3497,17 @@ public class LogPanel extends DockablePanel implements EventBatchListener, Profi
           if (evt.getClickCount() == 2) {
               int row = markerTable.rowAtPoint(evt.getPoint());
               if (row != -1) {
-                LoggingEventWrapper loggingEventWrapper = markerEventContainer.getRow(row);
-                if (loggingEventWrapper != null) {
-                    Object marker = loggingEventWrapper.getLoggingEvent().getProperty(ChainsawConstants.LOG4J_MARKER_COL_NAME_LOWERCASE);
+                LogEventWrapper logEventWrapper = markerEventContainer.getRow(row);
+                if (logEventWrapper != null) {
+                    Object marker = logEventWrapper.getLogEvent().getProperty(ChainsawConstants.LOG4J_MARKER_COL_NAME_LOWERCASE);
                     if (marker == null) {
-                        loggingEventWrapper.setProperty(ChainsawConstants.LOG4J_MARKER_COL_NAME_LOWERCASE, "set");
+                        logEventWrapper.setProperty(ChainsawConstants.LOG4J_MARKER_COL_NAME_LOWERCASE, "set");
                     } else {
-                        loggingEventWrapper.removeProperty(ChainsawConstants.LOG4J_MARKER_COL_NAME_LOWERCASE);
+                        logEventWrapper.removeProperty(ChainsawConstants.LOG4J_MARKER_COL_NAME_LOWERCASE);
                     }
                     //if marker -was- null, it no longer is (may need to add the column)
                     markerEventContainer.fireRowUpdated(row, (marker == null));
-                    otherMarkerEventContainer.fireRowUpdated(otherMarkerEventContainer.getRowIndex(loggingEventWrapper), (marker == null));
+                    otherMarkerEventContainer.fireRowUpdated(otherMarkerEventContainer.getRowIndex(logEventWrapper), (marker == null));
                 }
               }
           }
@@ -3547,7 +3545,7 @@ public class LogPanel extends DockablePanel implements EventBatchListener, Profi
 
         currentRow = row;
 
-        LoggingEventWrapper event = detailEventContainer.getRow(currentRow);
+        LogEventWrapper event = detailEventContainer.getRow(currentRow);
 
         if (event != null) {
           String toolTipText = getToolTipTextForEvent(event);
@@ -3648,14 +3646,14 @@ public class LogPanel extends DockablePanel implements EventBatchListener, Profi
         return;
       }
 
-	      LoggingEventWrapper loggingEventWrapper = null;
+	      LogEventWrapper logEventWrapper = null;
 	      if (force || (selectedRow != -1 && (lastRow != selectedRow))) {
-	        loggingEventWrapper = tableModel.getRow(selectedRow);
+	        logEventWrapper = tableModel.getRow(selectedRow);
 	
-	        if (loggingEventWrapper != null) {
+	        if (logEventWrapper != null) {
 	          final StringBuffer buf = new StringBuffer();
 	          buf.append(detailLayout.getHeader())
-	             .append(detailLayout.format(loggingEventWrapper.getLoggingEvent())).append(
+	             .append(detailLayout.format(logEventWrapper.getLogEvent())).append(
 	            detailLayout.getFooter());
 	          if (buf.length() > 0) {
 		          	try {
@@ -3675,7 +3673,7 @@ public class LogPanel extends DockablePanel implements EventBatchListener, Profi
 	        }
 	      }
 	
-	      if (loggingEventWrapper == null && (lastRow != selectedRow)) {
+	      if (logEventWrapper == null && (lastRow != selectedRow)) {
           	try {
           		final Document doc = detail.getEditorKit().createDefaultDocument();
           		detail.getEditorKit().read(new StringReader("<html>Nothing selected</html>"), doc, 0);
@@ -3733,14 +3731,14 @@ public class LogPanel extends DockablePanel implements EventBatchListener, Profi
                 return;
             }
 
-            LoggingEventWrapper loggingEventWrapper = throwableEventContainer.getRow(throwableTable.getSelectedRow());
+            LogEventWrapper logEventWrapper = throwableEventContainer.getRow(throwableTable.getSelectedRow());
 
             //throwable string representation may be a length-one empty array
-            String[] ti = loggingEventWrapper.getLoggingEvent().getThrowableStrRep();
+            String[] ti = logEventWrapper.getLogEvent().getThrowableStrRep();
             if (ti != null && ti.length > 0 && (!(ti.length == 1 && ti[0].equals("")))) {
                  detailDialog.setTitle(throwableTable.getColumnName(throwableTable.getSelectedColumn()) + " detail...");
                   StringBuffer buf = new StringBuffer();
-                  buf.append(loggingEventWrapper.getLoggingEvent().getMessage());
+                  buf.append(logEventWrapper.getLogEvent().getMessage());
                   buf.append("\n");
                   for (int i = 0; i < ti.length; i++) {
                     buf.append(ti[i]).append("\n    ");
@@ -3760,7 +3758,7 @@ public class LogPanel extends DockablePanel implements EventBatchListener, Profi
       JTable currentTable;
       JTextField textField = new JTextField();
       Set cellEditorListeners = new HashSet();
-      private LoggingEventWrapper currentLoggingEventWrapper;
+      private LogEventWrapper currentLogEventWrapper;
       private final Object mutex = new Object();
 
         public Object getCellEditorValue()
@@ -3782,13 +3780,13 @@ public class LogPanel extends DockablePanel implements EventBatchListener, Profi
         public boolean stopCellEditing()
         {
             if (textField.getText().trim().equals("")) {
-                currentLoggingEventWrapper.removeProperty(ChainsawConstants.LOG4J_MARKER_COL_NAME_LOWERCASE);
+                currentLogEventWrapper.removeProperty(ChainsawConstants.LOG4J_MARKER_COL_NAME_LOWERCASE);
             } else {
-                currentLoggingEventWrapper.setProperty(ChainsawConstants.LOG4J_MARKER_COL_NAME_LOWERCASE, textField.getText());
+                currentLogEventWrapper.setProperty(ChainsawConstants.LOG4J_MARKER_COL_NAME_LOWERCASE, textField.getText());
             }
             //row should always exist in the main table if it is being edited
-            tableModel.fireRowUpdated(tableModel.getRowIndex(currentLoggingEventWrapper), true);
-            int index = searchModel.getRowIndex(currentLoggingEventWrapper);
+            tableModel.fireRowUpdated(tableModel.getRowIndex(currentLogEventWrapper), true);
+            int index = searchModel.getRowIndex(currentLogEventWrapper);
             if (index > -1) {
               searchModel.fireRowUpdated(index, true);
             }
@@ -3802,7 +3800,7 @@ public class LogPanel extends DockablePanel implements EventBatchListener, Profi
             for (Iterator iter = cellEditorListenersCopy.iterator();iter.hasNext();) {
                 ((CellEditorListener)iter.next()).editingStopped(event);
             }
-            currentLoggingEventWrapper = null;
+            currentLogEventWrapper = null;
             currentTable = null;
 
             return true;
@@ -3819,7 +3817,7 @@ public class LogPanel extends DockablePanel implements EventBatchListener, Profi
            for (Iterator iter = cellEditorListenersCopy.iterator();iter.hasNext();) {
                ((CellEditorListener)iter.next()).editingCanceled(event);
            }
-          currentLoggingEventWrapper = null;
+          currentLogEventWrapper = null;
           currentTable = null;
         }
 
@@ -3840,9 +3838,9 @@ public class LogPanel extends DockablePanel implements EventBatchListener, Profi
         public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column)
         {
           currentTable = table;
-          currentLoggingEventWrapper =((EventContainer) table.getModel()).getRow(row);
-            if (currentLoggingEventWrapper != null) {
-                textField.setText(currentLoggingEventWrapper.getLoggingEvent().getProperty(ChainsawConstants.LOG4J_MARKER_COL_NAME_LOWERCASE));
+          currentLogEventWrapper =((EventContainer) table.getModel()).getRow(row);
+            if (currentLogEventWrapper != null) {
+                textField.setText(currentLogEventWrapper.getLogEvent().getProperty(ChainsawConstants.LOG4J_MARKER_COL_NAME_LOWERCASE));
                 textField.selectAll();
             }
             else {
@@ -3859,7 +3857,7 @@ public class LogPanel extends DockablePanel implements EventBatchListener, Profi
         }
 
         boolean primaryMatches(ThumbnailLoggingEventWrapper wrapper) {
-            String millisDelta = wrapper.loggingEventWrapper.getLoggingEvent().getProperty(ChainsawConstants.MILLIS_DELTA_COL_NAME_LOWERCASE);
+            String millisDelta = wrapper.logEventWrapper.getLogEvent().getProperty(ChainsawConstants.MILLIS_DELTA_COL_NAME_LOWERCASE);
             if (millisDelta != null && !millisDelta.trim().equals("")) {
                 long millisDeltaLong = Long.parseLong(millisDelta);
                 //arbitrary
@@ -3879,8 +3877,8 @@ public class LogPanel extends DockablePanel implements EventBatchListener, Profi
 
             int i=0;
             for (Iterator iter = tableModel.getFilteredEvents().iterator();iter.hasNext();) {
-                LoggingEventWrapper loggingEventWrapper = (LoggingEventWrapper) iter.next();
-                ThumbnailLoggingEventWrapper wrapper = new ThumbnailLoggingEventWrapper(i, loggingEventWrapper);
+                LogEventWrapper logEventWrapper = (LogEventWrapper) iter.next();
+                ThumbnailLoggingEventWrapper wrapper = new ThumbnailLoggingEventWrapper(i, logEventWrapper);
                 i++;
                 //only add if there is a color defined
                 if (primaryMatches(wrapper)) {
@@ -3917,7 +3915,7 @@ public class LogPanel extends DockablePanel implements EventBatchListener, Profi
                         int startX = 1;
                         int width = getWidth() - (startX * 2);
                         //max out at 50, min 2...
-                        String millisDelta = wrapper.loggingEventWrapper.getLoggingEvent().getProperty(ChainsawConstants.MILLIS_DELTA_COL_NAME_LOWERCASE);
+                        String millisDelta = wrapper.logEventWrapper.getLogEvent().getProperty(ChainsawConstants.MILLIS_DELTA_COL_NAME_LOWERCASE);
                         long millisDeltaLong = Long.parseLong(millisDelta);
                         long delta = Math.min(ChainsawConstants.MILLIS_DELTA_RENDERING_HEIGHT_MAX, Math.max(0, (long) (millisDeltaLong * ChainsawConstants.MILLIS_DELTA_RENDERING_FACTOR)));
                         float widthMaxMillisDeltaRenderRatio = ((float)width / ChainsawConstants.MILLIS_DELTA_RENDERING_HEIGHT_MAX);
@@ -3939,11 +3937,11 @@ public class LogPanel extends DockablePanel implements EventBatchListener, Profi
         }
 
         boolean primaryMatches(ThumbnailLoggingEventWrapper wrapper) {
-            return !wrapper.loggingEventWrapper.getColorRuleBackground().equals(ChainsawConstants.COLOR_DEFAULT_BACKGROUND);
+            return !wrapper.logEventWrapper.getColorRuleBackground().equals(ChainsawConstants.COLOR_DEFAULT_BACKGROUND);
         }
 
         boolean secondaryMatches(ThumbnailLoggingEventWrapper wrapper) {
-            return wrapper.loggingEventWrapper.isSearchMatch();
+            return wrapper.logEventWrapper.isSearchMatch();
         }
 
         private void configureColors() {
@@ -3952,8 +3950,8 @@ public class LogPanel extends DockablePanel implements EventBatchListener, Profi
 
             int i=0;
             for (Iterator iter = tableModel.getFilteredEvents().iterator();iter.hasNext();) {
-                LoggingEventWrapper loggingEventWrapper = (LoggingEventWrapper) iter.next();
-                ThumbnailLoggingEventWrapper wrapper = new ThumbnailLoggingEventWrapper(i, loggingEventWrapper);
+                LogEventWrapper logEventWrapper = (LogEventWrapper) iter.next();
+                ThumbnailLoggingEventWrapper wrapper = new ThumbnailLoggingEventWrapper(i, logEventWrapper);
                 if (secondaryMatches(wrapper)) {
                     secondaryList.add(wrapper);
                 }
@@ -3985,8 +3983,8 @@ public class LogPanel extends DockablePanel implements EventBatchListener, Profi
             //draw all non error/warning/marker events
             for (Iterator iter = primaryList.iterator();iter.hasNext();) {
                 ThumbnailLoggingEventWrapper wrapper = (ThumbnailLoggingEventWrapper)iter.next();
-                if (!wrapper.loggingEventWrapper.getColorRuleBackground().equals(ChainsawConstants.COLOR_DEFAULT_BACKGROUND)) {
-                    if (wrapper.loggingEventWrapper.getLoggingEvent().getLevel().toInt() < Level.WARN.toInt() && wrapper.loggingEventWrapper.getLoggingEvent().getProperty(ChainsawConstants.LOG4J_MARKER_COL_NAME_LOWERCASE) == null) {
+                if (!wrapper.logEventWrapper.getColorRuleBackground().equals(ChainsawConstants.COLOR_DEFAULT_BACKGROUND)) {
+                    if (wrapper.logEventWrapper.getLogEvent().getLevel().toInt() < Level.WARN.toInt() && wrapper.logEventWrapper.getLogEvent().getProperty(ChainsawConstants.LOG4J_MARKER_COL_NAME_LOWERCASE) == null) {
                         float ratio = (wrapper.rowNum / (float)rowCount);
         //                System.out.println("error - ratio: " + ratio + ", component height: " + componentHeight);
                         int verticalLocation = (int) (componentHeight * ratio);
@@ -3994,7 +3992,7 @@ public class LogPanel extends DockablePanel implements EventBatchListener, Profi
                         int startX = 1;
                         int width = getWidth() - (startX * 2);
 
-                        drawEvent(wrapper.loggingEventWrapper.getColorRuleBackground(), verticalLocation, eventHeight, g, startX, width);
+                        drawEvent(wrapper.logEventWrapper.getColorRuleBackground(), verticalLocation, eventHeight, g, startX, width);
         //                System.out.println("painting error - rownum: " + wrapper.rowNum + ", location: " + verticalLocation + ", height: " + eventHeight + ", component height: " + componentHeight + ", row count: " + rowCount);
                     }
                 }
@@ -4003,8 +4001,8 @@ public class LogPanel extends DockablePanel implements EventBatchListener, Profi
             //draw warnings, error, fatal & markers last (full width)
             for (Iterator iter = primaryList.iterator();iter.hasNext();) {
                 ThumbnailLoggingEventWrapper wrapper = (ThumbnailLoggingEventWrapper)iter.next();
-                if (!wrapper.loggingEventWrapper.getColorRuleBackground().equals(ChainsawConstants.COLOR_DEFAULT_BACKGROUND)) {
-                    if (wrapper.loggingEventWrapper.getLoggingEvent().getLevel().toInt() >= Level.WARN.toInt() || wrapper.loggingEventWrapper.getLoggingEvent().getProperty(ChainsawConstants.LOG4J_MARKER_COL_NAME_LOWERCASE) != null) {
+                if (!wrapper.logEventWrapper.getColorRuleBackground().equals(ChainsawConstants.COLOR_DEFAULT_BACKGROUND)) {
+                    if (wrapper.logEventWrapper.getLogEvent().getLevel().toInt() >= Level.WARN.toInt() || wrapper.logEventWrapper.getLogEvent().getProperty(ChainsawConstants.LOG4J_MARKER_COL_NAME_LOWERCASE) != null) {
                         float ratio = (wrapper.rowNum / (float)rowCount);
         //                System.out.println("error - ratio: " + ratio + ", component height: " + componentHeight);
                         int verticalLocation = (int) (componentHeight * ratio);
@@ -4017,7 +4015,7 @@ public class LogPanel extends DockablePanel implements EventBatchListener, Profi
                         eventHeight = Math.min(maxEventHeight, eventHeight + 3);
 //                            eventHeight = maxEventHeight;
 
-                        drawEvent(wrapper.loggingEventWrapper.getColorRuleBackground(), (verticalLocation - eventHeight + 1), eventHeight, g, startX, width);
+                        drawEvent(wrapper.logEventWrapper.getColorRuleBackground(), (verticalLocation - eventHeight + 1), eventHeight, g, startX, width);
     //                System.out.println("painting error - rownum: " + wrapper.rowNum + ", location: " + verticalLocation + ", height: " + eventHeight + ", component height: " + componentHeight + ", row count: " + rowCount);
                     }
                 }
@@ -4053,7 +4051,7 @@ public class LogPanel extends DockablePanel implements EventBatchListener, Profi
                     int yPosition = e.getPoint().y;
                     ThumbnailLoggingEventWrapper event = getEventWrapperAtPosition(yPosition);
                     if (event != null) {
-                        setToolTipText(getToolTipTextForEvent(event.loggingEventWrapper));
+                        setToolTipText(getToolTipTextForEvent(event.logEventWrapper));
                     }
                 } else {
                     setToolTipText(null);
@@ -4068,7 +4066,7 @@ public class LogPanel extends DockablePanel implements EventBatchListener, Profi
                     ThumbnailLoggingEventWrapper event = getEventWrapperAtPosition(yPosition);
 //                    System.out.println("rowToSelect: " + rowToSelect + ", closestRow: " + event.loggingEvent.getProperty("log4jid"));
                     if (event != null) {
-                        int id = Integer.parseInt(event.loggingEventWrapper.getLoggingEvent().getProperty("log4jid"));
+                        int id = Integer.parseInt(event.logEventWrapper.getLogEvent().getProperty("log4jid"));
                         setSelectedEvent(id);
                     }
                 }
@@ -4091,7 +4089,7 @@ public class LogPanel extends DockablePanel implements EventBatchListener, Profi
                     if (e.getType() == TableModelEvent.INSERT) {
 //                        System.out.println("insert - current warnings: " + warnings.size() + ", errors: " + errors.size() + ", first row: " + firstRow + ", last row: " + lastRow);
                         for (int i=firstRow;i<lastRow;i++) {
-                            LoggingEventWrapper event = (LoggingEventWrapper)displayedEvents.get(i);
+                            LogEventWrapper event = (LogEventWrapper)displayedEvents.get(i);
                             ThumbnailLoggingEventWrapper wrapper = new ThumbnailLoggingEventWrapper(i, event);
                             if (secondaryMatches(wrapper)) {
                                 secondaryList.add(wrapper);
@@ -4146,7 +4144,7 @@ public class LogPanel extends DockablePanel implements EventBatchListener, Profi
 //                        System.out.println("update - after deleting old warnings in range: " + firstRow + " to " + lastRow + ", new warnings: " + warnings.size() + ", errors: " + errors.size());
                         //NOTE: for update, we need to do i<= lastRow
                         for (int i=firstRow;i<=lastRow;i++) {
-                            LoggingEventWrapper event = (LoggingEventWrapper)displayedEvents.get(i);
+                            LogEventWrapper event = (LogEventWrapper)displayedEvents.get(i);
                             ThumbnailLoggingEventWrapper wrapper = new ThumbnailLoggingEventWrapper(i, event);
 //                                System.out.println("update - adding error: " + i + ", event: " + event.getMessage());
                             //only add event to thumbnail if there is a color
@@ -4253,14 +4251,14 @@ public class LogPanel extends DockablePanel implements EventBatchListener, Profi
 
     class ThumbnailLoggingEventWrapper {
         int rowNum;
-        LoggingEventWrapper loggingEventWrapper;
-        public ThumbnailLoggingEventWrapper(int rowNum, LoggingEventWrapper loggingEventWrapper) {
+        LogEventWrapper logEventWrapper;
+        public ThumbnailLoggingEventWrapper(int rowNum, LogEventWrapper logEventWrapper) {
             this.rowNum = rowNum;
-            this.loggingEventWrapper = loggingEventWrapper;
+            this.logEventWrapper = logEventWrapper;
         }
 
         public String toString() {
-            return "event - rownum: " + rowNum + ", level: " + loggingEventWrapper.getLoggingEvent().getLevel();
+            return "event - rownum: " + rowNum + ", level: " + logEventWrapper.getLogEvent().getLevel();
         }
 
         public boolean equals(Object o) {
@@ -4273,7 +4271,7 @@ public class LogPanel extends DockablePanel implements EventBatchListener, Profi
 
             ThumbnailLoggingEventWrapper that = (ThumbnailLoggingEventWrapper) o;
 
-            if (loggingEventWrapper != null ? !loggingEventWrapper.equals(that.loggingEventWrapper) : that.loggingEventWrapper != null) {
+            if (logEventWrapper != null ? !logEventWrapper.equals(that.logEventWrapper) : that.logEventWrapper != null) {
                 return false;
             }
 
@@ -4281,7 +4279,7 @@ public class LogPanel extends DockablePanel implements EventBatchListener, Profi
         }
 
         public int hashCode() {
-            return loggingEventWrapper != null ? loggingEventWrapper.hashCode() : 0;
+            return logEventWrapper != null ? logEventWrapper.hashCode() : 0;
         }
     }
 

http://git-wip-us.apache.org/repos/asf/logging-chainsaw/blob/deb3b3c0/src/main/java/org/apache/log4j/chainsaw/LogUI.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/log4j/chainsaw/LogUI.java b/src/main/java/org/apache/log4j/chainsaw/LogUI.java
index e252fd0..11178a9 100644
--- a/src/main/java/org/apache/log4j/chainsaw/LogUI.java
+++ b/src/main/java/org/apache/log4j/chainsaw/LogUI.java
@@ -86,11 +86,9 @@ import javax.swing.event.EventListenerList;
 import javax.swing.event.HyperlinkEvent;
 import javax.swing.event.HyperlinkListener;
 
-import org.apache.log4j.Appender;
-import org.apache.log4j.AppenderSkeleton;
-import org.apache.log4j.Level;
-import org.apache.log4j.LogManager;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 import org.apache.log4j.LoggerRepositoryExImpl;
 import org.apache.log4j.chainsaw.color.RuleColorizer;
 import org.apache.log4j.chainsaw.dnd.FileDnDTarget;
@@ -116,8 +114,6 @@ import org.apache.log4j.plugins.PluginEvent;
 import org.apache.log4j.plugins.PluginListener;
 import org.apache.log4j.plugins.PluginRegistry;
 import org.apache.log4j.plugins.Receiver;
-import org.apache.log4j.rewrite.PropertyRewritePolicy;
-import org.apache.log4j.rewrite.RewriteAppender;
 import org.apache.log4j.rule.ExpressionRule;
 import org.apache.log4j.rule.Rule;
 import org.apache.log4j.spi.Decoder;
@@ -127,6 +123,12 @@ import org.apache.log4j.spi.LoggingEvent;
 import org.apache.log4j.spi.RepositorySelector;
 import org.apache.log4j.xml.DOMConfigurator;
 import org.apache.log4j.xml.XMLDecoder;
+import org.apache.logging.log4j.core.Appender;
+import org.apache.logging.log4j.core.appender.rewrite.PropertiesRewritePolicy;
+import org.apache.logging.log4j.core.appender.rewrite.RewriteAppender;
+import org.apache.logging.log4j.core.appender.rewrite.RewritePolicy;
+import org.apache.logging.log4j.core.config.AppenderRef;
+import org.apache.logging.log4j.core.config.Property;
 
 
 /**
@@ -367,22 +369,31 @@ public class LogUI extends JFrame implements ChainsawViewer, SettingsListener {
     logUI.ensureChainsawAppenderHandlerAdded();
     logger = LogManager.getLogger(LogUI.class);
 
-    //set hostname, application and group properties which will cause Chainsaw and other apache-generated
-    //logging events to route (by default) to a tab named 'chainsaw-log'
-    PropertyRewritePolicy policy = new PropertyRewritePolicy();
-    policy.setProperties("hostname=chainsaw,application=log,group=chainsaw");
-    
-    RewriteAppender rewriteAppender = new RewriteAppender();
-    rewriteAppender.setRewritePolicy(policy);
-
-    Enumeration appenders = Logger.getLogger("org.apache").getAllAppenders();
+    Enumeration<Appender> appenders = Logger.getLogger("org.apache").getAllAppenders();
     if (!appenders.hasMoreElements()) {
     	appenders = Logger.getRootLogger().getAllAppenders();
     }
+
+    ArrayList<AppenderRef> appenderRefs = new ArrayList<>();
     while (appenders.hasMoreElements()) {
-    	Appender nextAppender = (Appender)appenders.nextElement();
-    	rewriteAppender.addAppender(nextAppender);
+        appenderRefs.add(AppenderRef.createAppenderRef(appenders.nextElement().getName(), Level.ALL, null));
     }
+
+    //set hostname, application and group properties which will cause Chainsaw and other apache-generated
+    //logging events to route (by default) to a tab named 'chainsaw-log'
+    RewritePolicy policy = PropertiesRewritePolicy.createPolicy(configuration, new Property[] {
+            Property.createProperty("hostname", "chainsaw"),
+            Property.createProperty("application", "log"),
+            Property.createProperty("group", "chainsaw")
+    });
+    RewriteAppender rewriteAppender = RewriteAppender.createAppender(
+            "rewrite",
+            true,
+            appenderRefs,
+            configuration,
+            policy,
+            null);
+
     Logger.getLogger("org.apache").removeAllAppenders();
     Logger.getLogger("org.apache").addAppender(rewriteAppender);
     Logger.getLogger("org.apache").setAdditivity(false);
@@ -2103,8 +2114,8 @@ public class LogUI extends JFrame implements ChainsawViewer, SettingsListener {
         Iterator iter2 = panel.getMatchingEvents(rule).iterator();
 
         while (iter2.hasNext()) {
-          LoggingEventWrapper e = (LoggingEventWrapper) iter2.next();
-          list.add(e.getLoggingEvent());
+          LogEventWrapper e = (LogEventWrapper) iter2.next();
+          list.add(e.getLogEvent());
         }
       }
 

http://git-wip-us.apache.org/repos/asf/logging-chainsaw/blob/deb3b3c0/src/main/java/org/apache/log4j/chainsaw/LoggingEventWrapper.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/log4j/chainsaw/LoggingEventWrapper.java b/src/main/java/org/apache/log4j/chainsaw/LoggingEventWrapper.java
deleted file mode 100644
index 63363a3..0000000
--- a/src/main/java/org/apache/log4j/chainsaw/LoggingEventWrapper.java
+++ /dev/null
@@ -1,190 +0,0 @@
-/*
- * 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.log4j.chainsaw;
-
-import java.awt.Color;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.log4j.helpers.Constants;
-import org.apache.log4j.rule.Rule;
-import org.apache.log4j.spi.LoggingEvent;
-
-/**
- * Wrap access to a LoggingEvent.  All property updates need to go through this object and not through the wrapped logging event,
- * since the properties are shared by two views of the same backing LoggingEvent, and loggingEvent itself creates a copy of passed-in properties..
- *
- * Property reads can be made on the actual LoggingEvent.
- */
-public class LoggingEventWrapper {
-  private final LoggingEvent loggingEvent;
-  private static final int DEFAULT_HEIGHT = -1;
-
-  private Color colorRuleBackground = ChainsawConstants.COLOR_DEFAULT_BACKGROUND;
-  private Color colorRuleForeground = ChainsawConstants.COLOR_DEFAULT_FOREGROUND;
-  private int markerHeight = DEFAULT_HEIGHT;
-  private int msgHeight = DEFAULT_HEIGHT;
-
-  //set to the log4jid value via setId - assumed to never change
-  private int id;
-
-  private boolean searchMatch = false;
-  //a Map of event fields to Sets of string matches (can be used to render matches differently)
-  Map eventMatches = new HashMap();
-  private LoggingEventWrapper syncWrapper;
-  private boolean displayed;
-
-  public LoggingEventWrapper(LoggingEvent loggingEvent) {
-    this.loggingEvent = loggingEvent;
-  }
-
-  public LoggingEventWrapper(LoggingEventWrapper loggingEventWrapper) {
-    this.loggingEvent = loggingEventWrapper.getLoggingEvent();
-    this.id = loggingEventWrapper.id;
-    this.syncWrapper = loggingEventWrapper;
-    loggingEventWrapper.syncWrapper = this;
-  }
-
-  public LoggingEvent getLoggingEvent() {
-    return loggingEvent;
-  }
-
-  public void setProperty(String propName, String propValue) {
-    loggingEvent.setProperty(propName, propValue);
-    if (id == 0 && propName.equals(Constants.LOG4J_ID_KEY)) {
-      id = Integer.parseInt(propValue);
-    }
-    if (syncWrapper != null && !propName.equals(ChainsawConstants.MILLIS_DELTA_COL_NAME_LOWERCASE)) {
-      syncWrapper.getLoggingEvent().setProperty(propName, propValue);
-    }
-  }
-
-  public Object removeProperty(String propName) {
-    Object result = loggingEvent.removeProperty(propName);
-    if (syncWrapper != null && !propName.equals(ChainsawConstants.MILLIS_DELTA_COL_NAME_LOWERCASE)) {
-      syncWrapper.getLoggingEvent().removeProperty(propName);
-    }
-    return result;
-  }
-
-  public Set getPropertyKeySet() {
-    return loggingEvent.getPropertyKeySet();
-  }
-
-  public void updateColorRuleColors(Color backgroundColor, Color foregroundColor) {
-    if (backgroundColor != null && foregroundColor != null) {
-      this.colorRuleBackground = backgroundColor;
-      this.colorRuleForeground = foregroundColor;
-      if (syncWrapper != null) {
-        syncWrapper.colorRuleBackground = this.colorRuleBackground;
-        syncWrapper.colorRuleForeground = this.colorRuleForeground;
-      }
-    } else {
-      this.colorRuleBackground = ChainsawConstants.COLOR_DEFAULT_BACKGROUND;
-      this.colorRuleForeground = ChainsawConstants.COLOR_DEFAULT_FOREGROUND;
-      if (syncWrapper != null) {
-        syncWrapper.colorRuleBackground = this.colorRuleBackground;
-        syncWrapper.colorRuleForeground = this.colorRuleForeground;
-      }
-    }
-  }
-
-  public void evaluateSearchRule(Rule searchRule) {
-    eventMatches.clear();
-    searchMatch = searchRule != null && searchRule.evaluate(loggingEvent, eventMatches);
-  }
-
-  public Map getSearchMatches() {
-    return eventMatches;
-  }
-
-  public Color getForeground() {
-    return colorRuleForeground;
-  }
-
-  public Color getBackground() {
-    return colorRuleBackground;
-  }
-
-  public Color getColorRuleBackground() {
-    return colorRuleBackground;
-  }
-
-  public Color getColorRuleForeground() {
-    return colorRuleForeground;
-  }
-
-  public boolean isSearchMatch() {
-    return searchMatch;
-  }
-
-  public void setMarkerHeight(int markerHeight) {
-    this.markerHeight = markerHeight;
-  }
-
-  public int getMarkerHeight() {
-    return markerHeight;
-  }
-
-  public void setMsgHeight(int msgHeight) {
-    this.msgHeight = msgHeight;
-  }
-
-  public int getMsgHeight() {
-    return msgHeight;
-  }
-
-  public void setDisplayed(boolean b) {
-    markerHeight = DEFAULT_HEIGHT;
-    msgHeight = DEFAULT_HEIGHT;
-    displayed = b;
-  }
-
-  public void setPreviousDisplayedEventTimestamp(long previousDisplayedEventTimeStamp) {
-    setProperty(ChainsawConstants.MILLIS_DELTA_COL_NAME_LOWERCASE, String.valueOf(loggingEvent.getTimeStamp() - previousDisplayedEventTimeStamp));
-  }
-
-  public boolean isDisplayed() {
-    return displayed;
-  }
-
-  public boolean equals(Object o) {
-    if (this == o) {
-      return true;
-    }
-    if (o == null || getClass() != o.getClass()) {
-      return false;
-    }
-
-    LoggingEventWrapper that = (LoggingEventWrapper) o;
-
-    if (id != that.id) {
-      return false;
-    }
-
-    return true;
-  }
-
-  public int hashCode() {
-    return id;
-  }
-
-  public String toString() {
-    return "LoggingEventWrapper - id: " + id + " background: " + getBackground() + ", foreground: " + getForeground() + ", msg: " + loggingEvent.getMessage();
-  }
-}

http://git-wip-us.apache.org/repos/asf/logging-chainsaw/blob/deb3b3c0/src/main/java/org/apache/log4j/chainsaw/TableColorizingRenderer.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/log4j/chainsaw/TableColorizingRenderer.java b/src/main/java/org/apache/log4j/chainsaw/TableColorizingRenderer.java
index 5d83d02..91451b8 100644
--- a/src/main/java/org/apache/log4j/chainsaw/TableColorizingRenderer.java
+++ b/src/main/java/org/apache/log4j/chainsaw/TableColorizingRenderer.java
@@ -173,8 +173,8 @@ public class TableColorizingRenderer extends DefaultTableCellRenderer {
     final JTable table, Object value, boolean isSelected, boolean hasFocus,
     int row, int col) {
     EventContainer container = (EventContainer) table.getModel();
-    LoggingEventWrapper loggingEventWrapper = container.getRow(row);
-    value = formatField(value, loggingEventWrapper);
+    LogEventWrapper logEventWrapper = container.getRow(row);
+    value = formatField(value, logEventWrapper);
     TableColumn tableColumn = table.getColumnModel().getColumn(col);
     int width = tableColumn.getWidth();
     JLabel label = (JLabel)super.getTableCellRendererComponent(table, value,
@@ -183,16 +183,16 @@ public class TableColorizingRenderer extends DefaultTableCellRenderer {
     int colIndex = tableColumn.getModelIndex() + 1;
 
     //no event, use default renderer
-    if (loggingEventWrapper == null) {
+    if (logEventWrapper == null) {
         return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, col);
     }
     long delta = 0;
     if (row > 0) {
-        LoggingEventWrapper previous = eventContainer.getRow(row - 1);
-        delta = Math.min(ChainsawConstants.MILLIS_DELTA_RENDERING_HEIGHT_MAX, Math.max(0, (long) ((loggingEventWrapper.getLoggingEvent().getTimeStamp() - previous.getLoggingEvent().getTimeStamp()) * ChainsawConstants.MILLIS_DELTA_RENDERING_FACTOR)));
+        LogEventWrapper previous = eventContainer.getRow(row - 1);
+        delta = Math.min(ChainsawConstants.MILLIS_DELTA_RENDERING_HEIGHT_MAX, Math.max(0, (long) ((logEventWrapper.getLogEvent().getTimeStamp() - previous.getLogEvent().getTimeStamp()) * ChainsawConstants.MILLIS_DELTA_RENDERING_FACTOR)));
     }
 
-    Map matches = loggingEventWrapper.getSearchMatches();
+    Map matches = logEventWrapper.getSearchMatches();
 
     JComponent component;
     switch (colIndex) {
@@ -325,8 +325,8 @@ public class TableColorizingRenderer extends DefaultTableCellRenderer {
               textPane.setBorder(getMiddleBorder(isSelected, 0));
             }
         }
-        int currentMarkerHeight = loggingEventWrapper.getMarkerHeight();
-        int currentMsgHeight = loggingEventWrapper.getMsgHeight();
+        int currentMarkerHeight = logEventWrapper.getMarkerHeight();
+        int currentMsgHeight = logEventWrapper.getMsgHeight();
         int newRowHeight = ChainsawConstants.DEFAULT_ROW_HEIGHT;
         boolean setHeight = false;
 
@@ -351,15 +351,15 @@ public class TableColorizingRenderer extends DefaultTableCellRenderer {
         }
 
         if (colIndex == ChainsawColumns.INDEX_LOG4J_MARKER_COL_NAME) {
-            loggingEventWrapper.setMarkerHeight(newRowHeight);
-            if (newRowHeight != currentMarkerHeight && newRowHeight >= loggingEventWrapper.getMsgHeight()) {
+            logEventWrapper.setMarkerHeight(newRowHeight);
+            if (newRowHeight != currentMarkerHeight && newRowHeight >= logEventWrapper.getMsgHeight()) {
                 setHeight = true;
             }
         }
 
         if (colIndex == ChainsawColumns.INDEX_MESSAGE_COL_NAME) {
-            loggingEventWrapper.setMsgHeight(newRowHeight);
-            if (newRowHeight != currentMsgHeight && newRowHeight >= loggingEventWrapper.getMarkerHeight()) {
+            logEventWrapper.setMsgHeight(newRowHeight);
+            if (newRowHeight != currentMsgHeight && newRowHeight >= logEventWrapper.getMarkerHeight()) {
                 setHeight = true;
             }
         }
@@ -394,7 +394,7 @@ public class TableColorizingRenderer extends DefaultTableCellRenderer {
 
     //remaining entries are properties
     default:
-        Set propertySet = loggingEventWrapper.getPropertyKeySet();
+        Set propertySet = logEventWrapper.getPropertyKeySet();
         String headerName = tableColumn.getHeaderValue().toString().toLowerCase();
         String thisProp = null;
         //find the property in the property set...case-sensitive
@@ -408,7 +408,7 @@ public class TableColorizingRenderer extends DefaultTableCellRenderer {
         if (thisProp != null) {
             String propKey = LoggingEventFieldResolver.PROP_FIELD + thisProp.toUpperCase();
             Set propKeyMatches = (Set)matches.get(propKey);
-            singleLineTextPane.setText(loggingEventWrapper.getLoggingEvent().getProperty(thisProp));
+            singleLineTextPane.setText(logEventWrapper.getLogEvent().getProperty(thisProp));
             setHighlightAttributesInternal(propKeyMatches, (StyledDocument) singleLineTextPane.getDocument());
         } else {
             singleLineTextPane.setText("");
@@ -422,16 +422,16 @@ public class TableColorizingRenderer extends DefaultTableCellRenderer {
     Color foreground;
     Rule loggerRule = colorizer.getLoggerRule();
     //use logger colors in table instead of event colors if event passes logger rule
-    if (loggerRule != null && loggerRule.evaluate(loggingEventWrapper.getLoggingEvent(), null)) {
+    if (loggerRule != null && loggerRule.evaluate(logEventWrapper.getLogEvent(), null)) {
         background = applicationPreferenceModel.getSearchBackgroundColor();
         foreground = applicationPreferenceModel.getSearchForegroundColor();
     } else {
         if (colorizeSearch && !applicationPreferenceModel.isBypassSearchColors()) {
-          background = loggingEventWrapper.isSearchMatch()?applicationPreferenceModel.getSearchBackgroundColor():loggingEventWrapper.getBackground();
-          foreground = loggingEventWrapper.isSearchMatch()?applicationPreferenceModel.getSearchForegroundColor():loggingEventWrapper.getForeground();
+          background = logEventWrapper.isSearchMatch()?applicationPreferenceModel.getSearchBackgroundColor(): logEventWrapper.getBackground();
+          foreground = logEventWrapper.isSearchMatch()?applicationPreferenceModel.getSearchForegroundColor(): logEventWrapper.getForeground();
         } else {
-          background = loggingEventWrapper.getBackground();
-          foreground = loggingEventWrapper.getForeground();
+          background = logEventWrapper.getBackground();
+          foreground = logEventWrapper.getForeground();
         }
     }
 
@@ -564,7 +564,7 @@ public class TableColorizingRenderer extends DefaultTableCellRenderer {
    *
    * @return formatted object
    */
-  private Object formatField(Object field, LoggingEventWrapper loggingEventWrapper) {
+  private Object formatField(Object field, LogEventWrapper logEventWrapper) {
     if (!(field instanceof Date)) {
       return (field == null ? "" : field);
     }
@@ -574,7 +574,7 @@ public class TableColorizingRenderer extends DefaultTableCellRenderer {
         return "" + (((Date)field).getTime() - relativeTimestampBase);
     }
     if (useRelativeTimesToPrevious) {
-        return loggingEventWrapper.getLoggingEvent().getProperty(ChainsawConstants.MILLIS_DELTA_COL_NAME_LOWERCASE);
+        return logEventWrapper.getLogEvent().getProperty(ChainsawConstants.MILLIS_DELTA_COL_NAME_LOWERCASE);
     }
 
     return dateFormatInUse.format((Date) field);

http://git-wip-us.apache.org/repos/asf/logging-chainsaw/blob/deb3b3c0/src/main/java/org/apache/log4j/chainsaw/dnd/FileDnDTarget.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/log4j/chainsaw/dnd/FileDnDTarget.java b/src/main/java/org/apache/log4j/chainsaw/dnd/FileDnDTarget.java
index 647a92c..f9236bf 100644
--- a/src/main/java/org/apache/log4j/chainsaw/dnd/FileDnDTarget.java
+++ b/src/main/java/org/apache/log4j/chainsaw/dnd/FileDnDTarget.java
@@ -17,7 +17,8 @@
 package org.apache.log4j.chainsaw.dnd;
 
 
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 import java.awt.datatransfer.DataFlavor;
 import java.awt.Color;
 import java.awt.datatransfer.Transferable;
@@ -42,7 +43,7 @@ import javax.swing.JComponent;
  * the standard PropertyChangesListener semantics to indicate that a list of 
  * files have been dropped onto the target.
  * 
- * If you wish to know whan the files have been dropped, subscribe to the "fileList" property change.
+ * If you wish to know what the files have been dropped, subscribe to the "fileList" property change.
  * 
  * @author psmith
  *
@@ -51,7 +52,7 @@ public class FileDnDTarget implements DropTargetListener{
     /**
      * Logger for this class
      */
-    private static final Logger LOG = Logger.getLogger(FileDnDTarget.class);
+    private static final Logger LOG = LogManager.getLogger(FileDnDTarget.class);
 
     protected int acceptableActions = DnDConstants.ACTION_COPY;
 

http://git-wip-us.apache.org/repos/asf/logging-chainsaw/blob/deb3b3c0/src/main/java/org/apache/log4j/chainsaw/filter/FilterModel.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/log4j/chainsaw/filter/FilterModel.java b/src/main/java/org/apache/log4j/chainsaw/filter/FilterModel.java
index 1b1670d..98010a4 100644
--- a/src/main/java/org/apache/log4j/chainsaw/filter/FilterModel.java
+++ b/src/main/java/org/apache/log4j/chainsaw/filter/FilterModel.java
@@ -17,8 +17,8 @@
 
 package org.apache.log4j.chainsaw.filter;
 
-import org.apache.log4j.spi.LoggingEvent;
-import org.apache.log4j.spi.LocationInfo;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.logging.log4j.core.LogEvent;
 
 /**
  * This class is used as a Model for Filtering, and retains the unique entries that
@@ -31,16 +31,16 @@ public class FilterModel {
   private EventTypeEntryContainer eventContainer =
     new EventTypeEntryContainer();
 
-  public void processNewLoggingEvent(LoggingEvent event) {
+  public void processNewLoggingEvent(LogEvent event) {
 
     eventContainer.addLevel(event.getLevel());
     eventContainer.addLogger(event.getLoggerName());
     eventContainer.addThread(event.getThreadName());
-    eventContainer.addNDC(event.getNDC());
-    eventContainer.addProperties(event.getProperties());
+    eventContainer.addNDC(StringUtils.join(event.getContextStack().asList(), ' '));
+    eventContainer.addProperties(event.getContextMap());
 
-    if (event.locationInformationExists()) {
-      LocationInfo info = event.getLocationInformation();
+    StackTraceElement info = event.getSource();
+    if (info != null) {
       eventContainer.addClass(info.getClassName());
       eventContainer.addMethod(info.getMethodName());
       eventContainer.addFileName(info.getFileName());

http://git-wip-us.apache.org/repos/asf/logging-chainsaw/blob/deb3b3c0/src/main/java/org/apache/log4j/chainsaw/help/HelpLocator.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/log4j/chainsaw/help/HelpLocator.java b/src/main/java/org/apache/log4j/chainsaw/help/HelpLocator.java
index 1ac3533..cce002e 100644
--- a/src/main/java/org/apache/log4j/chainsaw/help/HelpLocator.java
+++ b/src/main/java/org/apache/log4j/chainsaw/help/HelpLocator.java
@@ -25,8 +25,8 @@ import java.util.Arrays;
 import java.util.Iterator;
 import java.util.List;
 
-import org.apache.log4j.LogManager;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 import org.apache.log4j.chainsaw.messages.MessageCenter;
 
 /**

http://git-wip-us.apache.org/repos/asf/logging-chainsaw/blob/deb3b3c0/src/main/java/org/apache/log4j/chainsaw/help/HelpManager.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/log4j/chainsaw/help/HelpManager.java b/src/main/java/org/apache/log4j/chainsaw/help/HelpManager.java
index e5eec55..82418df 100644
--- a/src/main/java/org/apache/log4j/chainsaw/help/HelpManager.java
+++ b/src/main/java/org/apache/log4j/chainsaw/help/HelpManager.java
@@ -23,14 +23,14 @@ import java.beans.PropertyChangeSupport;
 import java.io.File;
 import java.net.URL;
 
-import org.apache.log4j.LogManager;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 import org.apache.log4j.chainsaw.ChainsawConstants;
 
 
 /**
  * Singleton help manager where objects can register to display
- * Help for something, an independant viewer can register to
+ * Help for something, an independent viewer can register to
  * be notified when the requested Help URL changes and can display
  * it appropriately. This class effectively decouples the help requester
  * from the help implementation (if any!)

http://git-wip-us.apache.org/repos/asf/logging-chainsaw/blob/deb3b3c0/src/main/java/org/apache/log4j/chainsaw/icons/LineIconFactory.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/log4j/chainsaw/icons/LineIconFactory.java b/src/main/java/org/apache/log4j/chainsaw/icons/LineIconFactory.java
index a7891c4..0524ecb 100644
--- a/src/main/java/org/apache/log4j/chainsaw/icons/LineIconFactory.java
+++ b/src/main/java/org/apache/log4j/chainsaw/icons/LineIconFactory.java
@@ -29,8 +29,8 @@ import java.awt.image.BufferedImage;
 import javax.swing.Icon;
 import javax.swing.ImageIcon;
 
-import org.apache.log4j.LogManager;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 
 /**

http://git-wip-us.apache.org/repos/asf/logging-chainsaw/blob/deb3b3c0/src/main/java/org/apache/log4j/chainsaw/layout/EventDetailLayout.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/log4j/chainsaw/layout/EventDetailLayout.java b/src/main/java/org/apache/log4j/chainsaw/layout/EventDetailLayout.java
index 8f463df..a128e76 100644
--- a/src/main/java/org/apache/log4j/chainsaw/layout/EventDetailLayout.java
+++ b/src/main/java/org/apache/log4j/chainsaw/layout/EventDetailLayout.java
@@ -17,15 +17,14 @@
 
 package org.apache.log4j.chainsaw.layout;
 
-import java.util.Hashtable;
-import java.util.Iterator;
-import java.util.Set;
+import org.apache.logging.log4j.core.LogEvent;
+import org.apache.logging.log4j.core.impl.Log4jLogEvent;
+import org.apache.logging.log4j.core.layout.PatternLayout;
+import org.apache.logging.log4j.message.SimpleMessage;
+import org.apache.logging.log4j.util.TriConsumer;
 
-import org.apache.log4j.EnhancedPatternLayout;
-import org.apache.log4j.Layout;
-import org.apache.log4j.Logger;
-import org.apache.log4j.spi.LocationInfo;
-import org.apache.log4j.spi.LoggingEvent;
+import java.util.HashMap;
+import java.util.Map;
 
 
 /**
@@ -34,99 +33,33 @@ import org.apache.log4j.spi.LoggingEvent;
  * when mouse-over on a particular log event row.
  *
  * It relies an an internal PatternLayout to accomplish this, but ensures HTML characters
- * from any LoggingEvent are escaped first.
+ * from any LogEvent are escaped first.
  *
  * @author Paul Smith &lt;psmith@apache.org&gt;
  */
-public class EventDetailLayout extends Layout {
-  private EnhancedPatternLayout patternLayout = new EnhancedPatternLayout();
+public class EventDetailLayout {
+  private PatternLayout patternLayout;
 
-  public EventDetailLayout() {
+  public synchronized void setConversionPattern(String conversionPattern) {
+    patternLayout = PatternLayout.newBuilder().withPattern(conversionPattern).build();
   }
 
-  public void setConversionPattern(String conversionPattern) {
-    patternLayout.setConversionPattern(conversionPattern);
-    patternLayout.activateOptions();
-  }
-
-  public String getConversionPattern() {
+  public synchronized String getConversionPattern() {
     return patternLayout.getConversionPattern();
   }
 
-  /* (non-Javadoc)
-   * @see org.apache.log4j.Layout#getFooter()
-   */
   public String getFooter() {
     return "";
   }
 
-  /* (non-Javadoc)
-   * @see org.apache.log4j.Layout#getHeader()
-   */
   public String getHeader() {
     return "";
   }
 
-  //  /* (non-Javadoc)
-  //   * @see org.apache.log4j.Layout#format(java.io.Writer, org.apache.log4j.spi.LoggingEvent)
-  //   */
-  //  public void format(Writer output, LoggingEvent event)
-  //    throws IOException {
-  //    boolean pastFirst = false;
-  //    output.write("<html><body><table cellspacing=0 cellpadding=0>");
-  //
-  //    List columnNames = ChainsawColumns.getColumnsNames();
-  //
-  //    Vector v = ChainsawAppenderHandler.convert(event);
-  //
-  //    /**
-  //     * we need to add the ID property from the event
-  //     */
-  //    v.add(event.getProperty(ChainsawConstants.LOG4J_ID_KEY));
-  //    
-  //    //             ListIterator iter = displayFilter.getDetailColumns().listIterator();
-  //    Iterator iter = columnNames.iterator();
-  //    String column = null;
-  //    int index = -1;
-  //
-  //    while (iter.hasNext()) {
-  //      column = (String) iter.next();
-  //      index = columnNames.indexOf(column);
-  //
-  //      if (index > -1) {
-  //        if (pastFirst) {
-  //          output.write("</td></tr>");
-  //        }
-  //
-  //        output.write("<tr><td valign=\"top\"><b>");
-  //        output.write(column);
-  //        output.write(": </b></td><td>");
-  //
-  //
-  //        if (index<v.size()) {
-  //			Object o = v.get(index);
-  //
-  //			if (o != null) {
-  //				output.write(escape(o.toString()));
-  //			} else {
-  //				output.write("{null}");
-  //			}
-  //			
-  //		}else {
-  ////            output.write("Invalid column " + column + " (index=" + index + ")");      
-  //        }
-  //
-  //        pastFirst = true;
-  //      }
-  //    }
-  //
-  //    output.write("</table></body></html>");
-  //  }
-
   /**
     * Escape &lt;, &gt; &amp; and &quot; as their entities. It is very
     * dumb about &amp; handling.
-    * @param aStr the String to escape.
+    * @param string the String to escape.
     * @return the escaped String
     */
   private static String escape(String string) {
@@ -134,7 +67,7 @@ public class EventDetailLayout extends Layout {
       return "";
     }
 
-    final StringBuffer buf = new StringBuffer();
+    final StringBuilder buf = new StringBuilder();
 
     for (int i = 0; i < string.length(); i++) {
       char c = string.charAt(i);
@@ -142,28 +75,22 @@ public class EventDetailLayout extends Layout {
       switch (c) {
       case '<':
         buf.append("&lt;");
-
         break;
 
       case '>':
         buf.append("&gt;");
-
         break;
 
       case '\"':
         buf.append("&quot;");
-
         break;
 
       case '&':
         buf.append("&amp;");
-
         break;
 
       default:
         buf.append(c);
-
-        break;
       }
     }
 
@@ -171,109 +98,65 @@ public class EventDetailLayout extends Layout {
   }
 
   /**
-   * Takes a source event and copies it into a new LoggingEvent object
+   * Takes a source event and copies it into a new LogEvent object
    * and ensuring all the internal elements of the event are HTML safe
    * @param event
-   * @return new LoggingEvent
+   * @return new LogEvent
    */
-  private static LoggingEvent copyForHTML(LoggingEvent event) {
-    Logger logger = Logger.getLogger(event.getLoggerName());
-    String threadName = event.getThreadName();
-    Object msg = escape(event.getMessage().toString());
-    String ndc = event.getNDC();
-//    Hashtable mdc = formatMDC(event);
-    LocationInfo li = null;
-    if (event.locationInformationExists()) {
+  private static LogEvent copyForHTML(LogEvent event) {
+    String msg = escape(event.getMessage().getFormattedMessage());
+    StackTraceElement li = null;
+    if (event.getSource() != null) {
         li = formatLocationInfo(event);
     }
-    Hashtable properties = formatProperties(event);
-    LoggingEvent copy = new LoggingEvent(null,
-	   logger, event.getTimeStamp(),
-	   event.getLevel(),
-	   msg,
-	   threadName,
-	   event.getThrowableInformation(),
-	   ndc,
-	   li,
-	   properties);
-    
-    return copy;
+    Map<String, String> properties = formatProperties(event);
+
+    return Log4jLogEvent.newBuilder()
+            .setLoggerFqcn(event.getLoggerFqcn())
+            .setLoggerName(event.getLoggerName())
+            .setTimeMillis(event.getTimeMillis())
+            .setNanoTime(event.getNanoTime())
+            .setLevel(event.getLevel())
+            .setMessage(new SimpleMessage(msg))
+            .setThreadName(event.getThreadName())
+            .setThreadId(event.getThreadId())
+            .setThreadPriority(event.getThreadPriority())
+            .setThrownProxy(event.getThrownProxy())
+            .setContextStack(event.getContextStack())
+            .setContextMap(properties)
+            .setSource(li)
+            .setMarker(event.getMarker())
+            .build();
   }
 
-//  /**
-//  * @param event
-//  * @return
-//  */
-//  private static Hashtable formatMDC(LoggingEvent event) {
-//    Set keySet = event.getMDCKeySet();
-//    Hashtable hashTable = new Hashtable();
-//
-//    for (Iterator iter = keySet.iterator(); iter.hasNext();) {
-//      Object key = (Object) iter.next();
-//      Object value = event.getMDC(key.toString());
-//      hashTable.put(escape(key.toString()), escape(value.toString()));
-//    }
-//
-//    return hashTable;
-//  }
-
-  /**
-   * @param event
-   * @return
-   */
-  private static LocationInfo formatLocationInfo(LoggingEvent event) {
-    LocationInfo info = event.getLocationInformation();
-    LocationInfo newInfo =
-      new LocationInfo(
-        escape(info.getFileName()), escape(info.getClassName()),
-        escape(info.getMethodName()), escape(info.getLineNumber()));
-
-    return newInfo;
+  private static StackTraceElement formatLocationInfo(LogEvent event) {
+    StackTraceElement info = event.getSource();
+    return new StackTraceElement(
+      escape(info.getFileName()), escape(info.getClassName()),
+      escape(info.getMethodName()), info.getLineNumber());
   }
 
-  /**
-   * @param event
-   * @return
-   */
-  private static Hashtable formatProperties(LoggingEvent event) {
-    Set keySet = event.getPropertyKeySet();
-    Hashtable hashTable = new Hashtable();
-
-    for (Iterator iter = keySet.iterator(); iter.hasNext();) {
-      Object key = iter.next();
-      Object value = event.getProperty(key.toString());
-      hashTable.put(escape(key.toString()), escape(value.toString()));
-    }
-
+  private static Map<String, String> formatProperties(LogEvent event) {
+    Map<String, String> hashTable = new HashMap<>();
+    event.getContextData().forEach(new TriConsumer<String, String, Map<String, String>>() {
+      @Override
+      public void accept(String key, String value, Map<String, String> state) {
+        state.put(escape(key), escape(value));
+      }
+    }, hashTable);
     return hashTable;
   }
 
-  /* (non-Javadoc)
-     * @see org.apache.log4j.Layout#ignoresThrowable()
-     */
-  public boolean ignoresThrowable() {
-    return false;
-  }
-
-  /* (non-Javadoc)
-   * @see org.apache.log4j.spi.OptionHandler#activateOptions()
-   */
-  public void activateOptions() {
-  }
-
-  /* (non-Javadoc)
-   * @see org.apache.log4j.Layout#format(java.io.Writer, org.apache.log4j.spi.LoggingEvent)
-   */
-  public String format(final LoggingEvent event) {
-      LoggingEvent newEvent =  copyForHTML(event);
-      /**
+  public String format(final LogEvent event) {
+      LogEvent newEvent = copyForHTML(event);
+      /*
        * Layouts are not thread-safe, but are normally
        * protected by the fact that their Appender is thread-safe.
        * 
        * But here in Chainsaw there is no such guarantees.
        */ 
-      synchronized(patternLayout) {
-          return patternLayout.format(newEvent);
+      synchronized (this) {
+          return patternLayout.toSerializable(newEvent);
       }
   }
 }

http://git-wip-us.apache.org/repos/asf/logging-chainsaw/blob/deb3b3c0/src/main/java/org/apache/log4j/chainsaw/layout/LayoutEditorPane.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/log4j/chainsaw/layout/LayoutEditorPane.java b/src/main/java/org/apache/log4j/chainsaw/layout/LayoutEditorPane.java
index dd27fb9..b8f7688 100644
--- a/src/main/java/org/apache/log4j/chainsaw/layout/LayoutEditorPane.java
+++ b/src/main/java/org/apache/log4j/chainsaw/layout/LayoutEditorPane.java
@@ -21,8 +21,10 @@ import java.awt.Dimension;
 import java.awt.Frame;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
+import java.util.Arrays;
 import java.util.Date;
-import java.util.Hashtable;
+import java.util.HashMap;
+import java.util.Map;
 
 import javax.swing.AbstractAction;
 import javax.swing.Action;
@@ -42,18 +44,20 @@ import javax.swing.event.CaretListener;
 import javax.swing.event.DocumentEvent;
 import javax.swing.event.DocumentListener;
 
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Level;
 import org.apache.log4j.chainsaw.ChainsawConstants;
 import org.apache.log4j.chainsaw.JTextComponentFormatter;
 import org.apache.log4j.chainsaw.icons.ChainsawIcons;
-import org.apache.log4j.spi.LocationInfo;
-import org.apache.log4j.spi.LoggingEvent;
-import org.apache.log4j.spi.ThrowableInformation;
+import org.apache.logging.log4j.core.LogEvent;
+import org.apache.logging.log4j.core.impl.Log4jLogEvent;
+import org.apache.logging.log4j.core.impl.ThrowableProxy;
+import org.apache.logging.log4j.message.SimpleMessage;
+import org.apache.logging.log4j.spi.MutableThreadContextStack;
 
 
 /**
  * An editor Pane that allows a user to Edit a Pattern Layout and preview the output it would
- * generate with an example LoggingEvent
+ * generate with an example LogEvent
  * 
  * @author Paul Smith &lt;psmith@apache.org&gt;
  *
@@ -78,7 +82,7 @@ public final class LayoutEditorPane extends JPanel {
     new JScrollPane(
     		ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,
     		ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
-  private LoggingEvent event;
+  private LogEvent event;
   private EventDetailLayout layout = new EventDetailLayout();
 
   /**
@@ -94,9 +98,6 @@ public final class LayoutEditorPane extends JPanel {
     setupListeners();
   }
 
-  /**
-  * @return
-  */
   private Action createCutAction() {
     final Action action =
       new AbstractAction("Cut", ChainsawIcons.ICON_CUT) {
@@ -110,9 +111,6 @@ public final class LayoutEditorPane extends JPanel {
     return action;
   }
 
-  /**
-   * @return
-   */
   private Action createCopyAction() {
     final Action action =
       new AbstractAction("Copy", ChainsawIcons.ICON_COPY) {
@@ -126,9 +124,6 @@ public final class LayoutEditorPane extends JPanel {
     return action;
   }
 
-  /**
-    *
-    */
   private void setupListeners() {
     patternEditor.getDocument().addDocumentListener(
       new DocumentListener() {
@@ -172,28 +167,29 @@ public final class LayoutEditorPane extends JPanel {
       *
       */
   private void createEvent() {
-    Hashtable hashTable = new Hashtable();
-    hashTable.put("key1", "val1");
-    hashTable.put("key2", "val2");
-    hashTable.put("key3", "val3");
-
-    LocationInfo li =
-      new LocationInfo(
-        "myfile.java", "com.mycompany.util.MyClass", "myMethod", "321");
-
-    ThrowableInformation tsr = new ThrowableInformation(new Exception());
-
-    event = new LoggingEvent("org.apache.log4j.Logger",
-	    Logger.getLogger("com.mycompany.mylogger"),
-		new Date().getTime(),
-		org.apache.log4j.Level.DEBUG,
-		"The quick brown fox jumped over the lazy dog",
-		"Thread-1",
-		tsr,
-		"NDC string",
-		li,
-		hashTable);
-    
+    Map<String, String> contextMap = new HashMap<>(3);
+    contextMap.put("key1", "val1");
+    contextMap.put("key2", "val2");
+    contextMap.put("key3", "val3");
+
+    StackTraceElement li =
+      new StackTraceElement(
+        "myfile.java", "com.mycompany.util.MyClass", "myMethod", 321);
+
+    ThrowableProxy tsr = new ThrowableProxy(new Exception());
+
+    event = Log4jLogEvent.newBuilder()
+                .setLoggerFqcn("org.apache.log4j.Logger")
+                .setLoggerName("com.mycompany.mylogger")
+                .setTimeMillis(new Date().getTime())
+                .setLevel(Level.DEBUG)
+                .setMessage(new SimpleMessage("The quick brown fox jumped over the lazy dog"))
+                .setThreadName("Thread-1")
+                .setThrownProxy(tsr)
+                .setContextStack(new MutableThreadContextStack(Arrays.asList("NDC", "string")))
+                .setContextMap(contextMap)
+                .setSource(li)
+                .build();
   }
 
   /**

http://git-wip-us.apache.org/repos/asf/logging-chainsaw/blob/deb3b3c0/src/main/java/org/apache/log4j/chainsaw/messages/MessageCenter.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/log4j/chainsaw/messages/MessageCenter.java b/src/main/java/org/apache/log4j/chainsaw/messages/MessageCenter.java
index bf858b5..4e7a052 100644
--- a/src/main/java/org/apache/log4j/chainsaw/messages/MessageCenter.java
+++ b/src/main/java/org/apache/log4j/chainsaw/messages/MessageCenter.java
@@ -40,16 +40,17 @@ import javax.swing.ListModel;
 import javax.swing.event.ListDataEvent;
 import javax.swing.event.ListDataListener;
 
-import org.apache.log4j.Layout;
-import org.apache.log4j.Level;
-import org.apache.log4j.Logger;
-import org.apache.log4j.TTCCLayout;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.core.Layout;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.Logger;
 import org.apache.log4j.chainsaw.ChainsawConstants;
-import org.apache.log4j.chainsaw.LoggingEventWrapper;
+import org.apache.log4j.chainsaw.LogEventWrapper;
 import org.apache.log4j.chainsaw.PopupListener;
 import org.apache.log4j.chainsaw.SmallButton;
 import org.apache.log4j.chainsaw.icons.ChainsawIcons;
 import org.apache.log4j.varia.ListModelAppender;
+import org.apache.logging.log4j.core.layout.PatternLayout;
 
 
 /**
@@ -73,8 +74,8 @@ import org.apache.log4j.varia.ListModelAppender;
  */
 public class MessageCenter {
   private static final MessageCenter instance = new MessageCenter();
-  private final Logger logger = Logger.getLogger(MessageCenter.class);
-  private Layout layout = new TTCCLayout();
+  private final Logger logger = LogManager.getLogger(MessageCenter.class);
+  private Layout layout = PatternLayout.newBuilder().withPattern(PatternLayout.TTCC_CONVERSION_PATTERN).build();
   private final JList messageList = new JList();
   private final ListModelAppender appender = new ListModelAppender();
   private ListCellRenderer listCellRenderer =
@@ -241,7 +242,7 @@ public class MessageCenter {
     public Component getListCellRendererComponent(
       JList list, Object value, int index, boolean isSelected,
       boolean cellHasFocus) {
-      value = layout.format(((LoggingEventWrapper) value).getLoggingEvent());
+      value = layout.format(((LogEventWrapper) value).getLogEvent());
 
       Component c =
         super.getListCellRendererComponent(

http://git-wip-us.apache.org/repos/asf/logging-chainsaw/blob/deb3b3c0/src/main/java/org/apache/log4j/chainsaw/osx/OSXIntegration.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/log4j/chainsaw/osx/OSXIntegration.java b/src/main/java/org/apache/log4j/chainsaw/osx/OSXIntegration.java
index dec20b0..110c39f 100644
--- a/src/main/java/org/apache/log4j/chainsaw/osx/OSXIntegration.java
+++ b/src/main/java/org/apache/log4j/chainsaw/osx/OSXIntegration.java
@@ -21,7 +21,8 @@ import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.lang.reflect.Proxy;
 
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 import org.apache.log4j.chainsaw.LogUI;
 
 
@@ -38,7 +39,7 @@ import org.apache.log4j.chainsaw.LogUI;
  */
 public class OSXIntegration {
     public static final boolean IS_OSX = System.getProperty("os.name").startsWith("Mac OS X");
-    private static final Logger LOG = Logger.getLogger(OSXIntegration.class);
+    private static final Logger LOG = LogManager.getLogger(OSXIntegration.class);
     private static Object applicationInstance;
     public static final void init(final LogUI logui) {
         LOG.info("OSXIntegration.init() called");

http://git-wip-us.apache.org/repos/asf/logging-chainsaw/blob/deb3b3c0/src/main/java/org/apache/log4j/chainsaw/receivers/ReceiversPanel.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/log4j/chainsaw/receivers/ReceiversPanel.java b/src/main/java/org/apache/log4j/chainsaw/receivers/ReceiversPanel.java
index baf45a1..8425943 100644
--- a/src/main/java/org/apache/log4j/chainsaw/receivers/ReceiversPanel.java
+++ b/src/main/java/org/apache/log4j/chainsaw/receivers/ReceiversPanel.java
@@ -58,9 +58,9 @@ import javax.swing.tree.DefaultMutableTreeNode;
 import javax.swing.tree.ExpandVetoException;
 import javax.swing.tree.TreePath;
 
-import org.apache.log4j.Level;
-import org.apache.log4j.LogManager;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 import org.apache.log4j.chainsaw.PopupListener;
 import org.apache.log4j.chainsaw.SmallButton;
 import org.apache.log4j.chainsaw.prefs.SettingsManager;

http://git-wip-us.apache.org/repos/asf/logging-chainsaw/blob/deb3b3c0/src/main/java/org/apache/log4j/chainsaw/zeroconf/ZeroConfPlugin.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/log4j/chainsaw/zeroconf/ZeroConfPlugin.java b/src/main/java/org/apache/log4j/chainsaw/zeroconf/ZeroConfPlugin.java
index 89574d2..1d8b69e 100644
--- a/src/main/java/org/apache/log4j/chainsaw/zeroconf/ZeroConfPlugin.java
+++ b/src/main/java/org/apache/log4j/chainsaw/zeroconf/ZeroConfPlugin.java
@@ -48,9 +48,8 @@ import javax.swing.SwingUtilities;
 import javax.swing.event.TableModelEvent;
 import javax.swing.event.TableModelListener;
 
-import org.apache.log4j.BasicConfigurator;
-import org.apache.log4j.LogManager;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 import org.apache.log4j.chainsaw.ChainsawConstants;
 import org.apache.log4j.chainsaw.LogFilePatternLayoutBuilder;
 import org.apache.log4j.chainsaw.SmallButton;
@@ -59,7 +58,6 @@ import org.apache.log4j.chainsaw.icons.ChainsawIcons;
 import org.apache.log4j.chainsaw.plugins.GUIPluginSkeleton;
 import org.apache.log4j.chainsaw.prefs.SettingsManager;
 import org.apache.log4j.chainsaw.vfs.VFSLogFilePatternReceiver;
-import org.apache.log4j.helpers.LogLog;
 import org.apache.log4j.net.MulticastReceiver;
 import org.apache.log4j.net.SocketHubReceiver;
 import org.apache.log4j.net.SocketReceiver;
@@ -74,6 +72,7 @@ import org.apache.log4j.spi.LoggerRepositoryEx;
 
 import com.thoughtworks.xstream.XStream;
 import com.thoughtworks.xstream.io.xml.DomDriver;
+import org.apache.logging.log4j.status.StatusLogger;
 
 /**
  * This plugin is designed to detect specific Zeroconf zones (Rendevouz/Bonjour,
@@ -90,7 +89,7 @@ import com.thoughtworks.xstream.io.xml.DomDriver;
  */
 public class ZeroConfPlugin extends GUIPluginSkeleton {
 
-    private static final Logger LOG = Logger.getLogger(ZeroConfPlugin.class);
+    private static final Logger LOG = LogManager.getLogger(ZeroConfPlugin.class);
 
     private ZeroConfDeviceModel discoveredDevices = new ZeroConfDeviceModel();
 
@@ -588,7 +587,7 @@ public class ZeroConfPlugin extends GUIPluginSkeleton {
             return receiver;
         }
         //not recognized
-        LogLog.debug("Unable to find receiver for appender with service name: " + zone);
+        StatusLogger.getLogger().debug("Unable to find receiver for appender with service name: " + zone);
         return null;
     }
 

http://git-wip-us.apache.org/repos/asf/logging-chainsaw/blob/deb3b3c0/src/main/java/org/apache/log4j/db/DBReceiver.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/log4j/db/DBReceiver.java b/src/main/java/org/apache/log4j/db/DBReceiver.java
index dbd1ef5..dbef7de 100644
--- a/src/main/java/org/apache/log4j/db/DBReceiver.java
+++ b/src/main/java/org/apache/log4j/db/DBReceiver.java
@@ -21,11 +21,6 @@ import org.apache.log4j.plugins.Pauseable;
 import org.apache.log4j.plugins.Receiver;
 import org.apache.log4j.scheduler.Scheduler;
 import org.apache.log4j.spi.LoggerRepositoryEx;
-import org.apache.log4j.xml.DOMConfigurator;
-import org.apache.log4j.xml.UnrecognizedElementHandler;
-import org.w3c.dom.Element;
-
-import java.util.Properties;
 
 /**
  *
@@ -33,7 +28,7 @@ import java.util.Properties;
  * @author Ceki G&uuml;lc&uuml;
  *
  */
-public class DBReceiver extends Receiver implements Pauseable, UnrecognizedElementHandler {
+public class DBReceiver extends Receiver implements Pauseable {
   /**
    * By default we refresh data every 1000 milliseconds.
    * @see #setRefreshMillis
@@ -120,21 +115,4 @@ public class DBReceiver extends Receiver implements Pauseable, UnrecognizedEleme
     return paused;
   }
 
-    /**
-     * {@inheritDoc}
-     */
-  public boolean parseUnrecognizedElement(Element element, Properties props) throws Exception {
-        if ("connectionSource".equals(element.getNodeName())) {
-            Object instance =
-                    DOMConfigurator.parseElement(element, props, ConnectionSource.class);
-            if (instance instanceof ConnectionSource) {
-                ConnectionSource source = (ConnectionSource) instance;
-                source.activateOptions();
-                setConnectionSource(source);
-            }
-            return true;
-        }
-        return false;
-  }
-
 }

http://git-wip-us.apache.org/repos/asf/logging-chainsaw/blob/deb3b3c0/src/main/java/org/apache/log4j/db/DBReceiverJob.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/log4j/db/DBReceiverJob.java b/src/main/java/org/apache/log4j/db/DBReceiverJob.java
index 1e29663..6e5dcea 100644
--- a/src/main/java/org/apache/log4j/db/DBReceiverJob.java
+++ b/src/main/java/org/apache/log4j/db/DBReceiverJob.java
@@ -17,19 +17,24 @@
 
 package org.apache.log4j.db;
 
-import org.apache.log4j.Level;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 import org.apache.log4j.scheduler.Job;
 import org.apache.log4j.spi.ComponentBase;
-import org.apache.log4j.spi.LocationInfo;
-import org.apache.log4j.spi.LoggingEvent;
-import org.apache.log4j.spi.ThrowableInformation;
+import org.apache.logging.log4j.core.LogEvent;
+import org.apache.logging.log4j.core.impl.Log4jLogEvent;
+import org.apache.logging.log4j.core.impl.ThrowableProxy;
+import org.apache.logging.log4j.message.SimpleMessage;
+import org.apache.logging.log4j.spi.MutableThreadContextStack;
 
 import java.sql.Connection;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
-import java.util.Hashtable;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
 import java.util.Vector;
 
 /**
@@ -77,19 +82,19 @@ class DBReceiverJob extends ComponentBase implements Job {
 	    long timeStamp = 0L;
 	    String level = null;
 	    String threadName = null;
-	    Object message = null;
+	    String message = null;
 	    String ndc = null;
 	    String className = null;
 	    String methodName = null;
 	    String fileName = null;
 	    String lineNumber = null;
-	    Hashtable properties = new Hashtable();
+	    Map<String, String> properties = new HashMap<>();
 	
 
         //event.setSequenceNumber(rs.getLong(1));
         timeStamp = rs.getLong(2);
         message = rs.getString(3);
-		logger = Logger.getLogger(rs.getString(4));
+		logger = LogManager.getLogger(rs.getString(4));
         level = rs.getString(5);
 		Level levelImpl = Level.toLevel(level.trim());
 
@@ -103,42 +108,43 @@ class DBReceiverJob extends ComponentBase implements Job {
         methodName = rs.getString(11);
         lineNumber = rs.getString(12).trim();
 
-		LocationInfo locationInfo = null;
-        if (fileName.equals(LocationInfo.NA)) {
-          locationInfo = LocationInfo.NA_LOCATION_INFO;
+		StackTraceElement locationInfo;
+        if (fileName.equals("?")) {
+          locationInfo = null;
         } else {
-          locationInfo = new LocationInfo(fileName, className,
-              methodName, lineNumber);
+          locationInfo = new StackTraceElement(fileName, className,
+              methodName, Integer.parseInt(lineNumber));
         }
 
         long id = rs.getLong(13);
         //LogLog.info("Received event with id=" + id);
         lastId = id;
 
-		ThrowableInformation throwableInfo = null;
+		ThrowableProxy throwableInfo = null;
         if ((mask & DBHelper.EXCEPTION_EXISTS) != 0) {
           throwableInfo = getException(connection, id);
         }
 
-	    LoggingEvent event = new LoggingEvent(logger.getName(),
-	            logger, timeStamp, levelImpl, message,
-	            threadName,
-	            throwableInfo,
-	            ndc,
-	            locationInfo,
-	            properties);
-
-
         // Scott asked for this info to be
-        event.setProperty("log4jid", Long.toString(id));
+        properties.put("log4jid", Long.toString(id));
+
+	    LogEvent event = Log4jLogEvent.newBuilder()
+	                .setLoggerFqcn(logger.getName())
+	                .setLoggerName(logger.getName())
+	                .setTimeMillis(timeStamp)
+	                .setLevel(levelImpl)
+	                .setMessage(new SimpleMessage(message))
+	                .setThreadName(threadName)
+	                .setThrownProxy(throwableInfo)
+                    .setContextStack(new MutableThreadContextStack(Arrays.asList(ndc.split(" "))))
+	                .setContextMap(properties)
+	                .setSource(locationInfo)
+	                .build();
 
         if ((mask & DBHelper.PROPERTIES_EXIST) != 0) {
           getProperties(connection, id, event);
         }
 
-
-
-
         if (!parentDBReceiver.isPaused()) {
           parentDBReceiver.doPost(event);
         }
@@ -171,7 +177,7 @@ class DBReceiverJob extends ComponentBase implements Job {
    * @param event
    * @throws SQLException
    */
-  void getProperties(Connection connection, long id, LoggingEvent event)
+  void getProperties(Connection connection, long id, LogEvent event)
       throws SQLException {
 
     PreparedStatement statement = connection.prepareStatement(sqlProperties);
@@ -182,7 +188,7 @@ class DBReceiverJob extends ComponentBase implements Job {
       while (rs.next()) {
         String key = rs.getString(1);
         String value = rs.getString(2);
-        event.setProperty(key, value);
+        event.getContextMap().put(key, value);
       }
     } finally {
       statement.close();
@@ -197,7 +203,7 @@ class DBReceiverJob extends ComponentBase implements Job {
    * @param id
    * @throws SQLException
    */
-  ThrowableInformation getException(Connection connection, long id)
+  ThrowableProxy getException(Connection connection, long id)
       throws SQLException {
 
     PreparedStatement statement = null;
@@ -220,7 +226,7 @@ class DBReceiverJob extends ComponentBase implements Job {
         strRep[i] = (String) v.get(i);
       }
       // we've filled strRep, we now attach it to the event
-      return new ThrowableInformation(strRep);
+      return new ThrowableProxy(strRep);
     } finally {
       if (statement != null) {
         statement.close();


[4/4] logging-chainsaw git commit: Try to upgrade to Log4j 2

Posted by mi...@apache.org.
Try to upgrade to Log4j 2


Project: http://git-wip-us.apache.org/repos/asf/logging-chainsaw/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-chainsaw/commit/deb3b3c0
Tree: http://git-wip-us.apache.org/repos/asf/logging-chainsaw/tree/deb3b3c0
Diff: http://git-wip-us.apache.org/repos/asf/logging-chainsaw/diff/deb3b3c0

Branch: refs/heads/log4j-2
Commit: deb3b3c04ee16b63d037798dccec43d1e0ca2674
Parents: a92fbca
Author: Mikael Ståldal <mi...@staldal.nu>
Authored: Mon Nov 20 21:34:18 2017 +0100
Committer: Mikael Ståldal <mi...@staldal.nu>
Committed: Mon Nov 20 21:34:18 2017 +0100

----------------------------------------------------------------------
 pom.xml                                         |  24 +-
 .../apache/log4j/LoggerRepositoryExImpl.java    |  77 ++---
 .../ChainsawCyclicBufferTableModel.java         | 138 ++++----
 .../apache/log4j/chainsaw/ColumnComparator.java |   6 +-
 .../chainsaw/CopyEventsToClipboardAction.java   |   2 +-
 .../apache/log4j/chainsaw/EventContainer.java   |   8 +-
 .../apache/log4j/chainsaw/FileSaveAction.java   |   6 +-
 .../apache/log4j/chainsaw/LogEventWrapper.java  | 189 ++++++++++
 .../chainsaw/LogFilePatternLayoutBuilder.java   | 199 +++++------
 .../org/apache/log4j/chainsaw/LogPanel.java     | 156 +++++----
 .../java/org/apache/log4j/chainsaw/LogUI.java   |  51 +--
 .../log4j/chainsaw/LoggingEventWrapper.java     | 190 ----------
 .../log4j/chainsaw/TableColorizingRenderer.java |  42 +--
 .../log4j/chainsaw/dnd/FileDnDTarget.java       |   7 +-
 .../log4j/chainsaw/filter/FilterModel.java      |  14 +-
 .../apache/log4j/chainsaw/help/HelpLocator.java |   4 +-
 .../apache/log4j/chainsaw/help/HelpManager.java |   6 +-
 .../log4j/chainsaw/icons/LineIconFactory.java   |   4 +-
 .../chainsaw/layout/EventDetailLayout.java      | 231 +++----------
 .../log4j/chainsaw/layout/LayoutEditorPane.java |  72 ++--
 .../log4j/chainsaw/messages/MessageCenter.java  |  17 +-
 .../log4j/chainsaw/osx/OSXIntegration.java      |   5 +-
 .../chainsaw/receivers/ReceiversPanel.java      |   6 +-
 .../log4j/chainsaw/zeroconf/ZeroConfPlugin.java |  11 +-
 .../java/org/apache/log4j/db/DBReceiver.java    |  24 +-
 .../java/org/apache/log4j/db/DBReceiverJob.java |  70 ++--
 .../apache/log4j/helpers/UtilLoggingLevel.java  | 140 ++------
 .../org/apache/log4j/net/MulticastAppender.java | 345 -------------------
 .../java/org/apache/log4j/net/SocketNode13.java |  18 +-
 .../org/apache/log4j/net/SocketReceiver.java    |   4 +-
 .../java/org/apache/log4j/net/UDPAppender.java  | 330 ------------------
 .../org/apache/log4j/net/ZeroConfSupport.java   | 193 +++++++++++
 .../org/apache/log4j/or/DefaultRenderer.java    |  42 +++
 .../org/apache/log4j/or/ObjectRenderer.java     |  32 ++
 .../java/org/apache/log4j/or/RendererMap.java   | 199 +++++++++++
 .../java/org/apache/log4j/plugins/Plugin.java   |   2 +-
 .../java/org/apache/log4j/plugins/Receiver.java |  14 +-
 .../apache/log4j/rewrite/MapRewritePolicy.java  |  85 -----
 .../log4j/rewrite/PropertyRewritePolicy.java    |  93 -----
 .../log4j/rewrite/ReflectionRewritePolicy.java  |  89 -----
 .../apache/log4j/rewrite/RewriteAppender.java   | 199 -----------
 .../org/apache/log4j/rewrite/RewritePolicy.java |  37 --
 .../org/apache/log4j/spi/ComponentBase.java     |   2 +-
 src/main/java/org/apache/log4j/spi/Decoder.java |  12 +-
 .../log4j/spi/HierarchyEventListener.java       |  36 ++
 .../java/org/apache/log4j/spi/Log4JULogger.java |  16 +-
 .../apache/log4j/spi/LoggerEventListener.java   |   4 +-
 .../org/apache/log4j/spi/LoggerFactory.java     |  35 ++
 .../org/apache/log4j/spi/LoggerRepository.java  |  88 +++++
 .../apache/log4j/spi/LoggerRepositoryEx.java    |   9 +-
 .../org/apache/log4j/spi/OptionHandler.java     |  62 ++++
 .../org/apache/log4j/spi/RendererSupport.java   |  33 ++
 .../org/apache/log4j/spi/Thresholdable.java     |   4 +-
 .../apache/log4j/varia/ListModelAppender.java   |  21 +-
 .../org/apache/log4j/xml/SAXErrorHandler.java   |  48 +++
 .../apache/log4j/xml/UtilLoggingXMLDecoder.java |  64 ++--
 .../java/org/apache/log4j/xml/XMLDecoder.java   |  60 ++--
 .../log4j/rewrite/RewriteAppenderTest.java      | 132 -------
 .../resources/org/apache/log4j/rewrite/map.log  |   3 -
 .../resources/org/apache/log4j/rewrite/map.xml  |  38 --
 .../org/apache/log4j/rewrite/property.log       |   2 -
 .../org/apache/log4j/rewrite/property.xml       |  40 ---
 .../org/apache/log4j/rewrite/reflection.log     |   3 -
 .../org/apache/log4j/rewrite/reflection.xml     |  38 --
 64 files changed, 1593 insertions(+), 2538 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-chainsaw/blob/deb3b3c0/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index e641266..7c2207f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -20,7 +20,7 @@
   <groupId>log4j</groupId>
   <artifactId>apache-chainsaw</artifactId>
   <name>Apache Chainsaw</name>
-  <version>2.0.0</version>
+  <version>3.0.0</version>
   <description>Graphical Viewer for Logging events from a local or remote log4j event system.</description>
   <url>https://logging.apache.org/chainsaw</url>
   <inceptionYear>2002</inceptionYear>
@@ -139,8 +139,8 @@
       <plugin>
         <artifactId>maven-compiler-plugin</artifactId>
         <configuration>
-          <source>1.6</source>
-          <target>1.6</target>
+          <source>1.7</source>
+          <target>1.7</target>
         </configuration>
       </plugin>
       <plugin>
@@ -382,14 +382,19 @@
   </build>
   <dependencies>
     <dependency>
-      <groupId>log4j</groupId>
-      <artifactId>apache-log4j-extras</artifactId>
-      <version>1.1</version>
+      <groupId>org.apache.logging.log4j</groupId>
+      <artifactId>log4j-api</artifactId>
+      <version>2.9.1</version>
     </dependency>
     <dependency>
-      <groupId>log4j</groupId>
-      <artifactId>log4j</artifactId>
-      <version>1.2.16</version>
+      <groupId>org.apache.logging.log4j</groupId>
+      <artifactId>log4j-core</artifactId>
+      <version>2.9.1</version>
+    </dependency>
+    <dependency>
+        <groupId>org.apache.commons</groupId>
+        <artifactId>commons-lang3</artifactId>
+        <version>3.7</version>
     </dependency>
     <dependency>
       <groupId>javax.jmdns</groupId>
@@ -533,4 +538,3 @@
     </profile>
   </profiles>
 </project>
-

http://git-wip-us.apache.org/repos/asf/logging-chainsaw/blob/deb3b3c0/src/main/java/org/apache/log4j/LoggerRepositoryExImpl.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/log4j/LoggerRepositoryExImpl.java b/src/main/java/org/apache/log4j/LoggerRepositoryExImpl.java
index c2f5aaf..e71435b 100644
--- a/src/main/java/org/apache/log4j/LoggerRepositoryExImpl.java
+++ b/src/main/java/org/apache/log4j/LoggerRepositoryExImpl.java
@@ -17,10 +17,8 @@
 
 package org.apache.log4j;
 
-import org.apache.log4j.helpers.LogLog;
 import org.apache.log4j.or.ObjectRenderer;
 import org.apache.log4j.or.RendererMap;
-import org.apache.log4j.plugins.Plugin;
 import org.apache.log4j.plugins.PluginRegistry;
 import org.apache.log4j.scheduler.Scheduler;
 import org.apache.log4j.spi.ErrorItem;
@@ -31,17 +29,18 @@ import org.apache.log4j.spi.LoggerRepository;
 import org.apache.log4j.spi.LoggerRepositoryEventListener;
 import org.apache.log4j.spi.LoggerRepositoryEx;
 import org.apache.log4j.spi.RendererSupport;
-import org.apache.log4j.xml.UnrecognizedElementHandler;
-import org.apache.log4j.xml.DOMConfigurator;
-import org.w3c.dom.Element;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.Logger;
+import org.apache.logging.log4j.core.Appender;
+import org.apache.logging.log4j.status.StatusLogger;
 
 import java.util.ArrayList;
 import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.Hashtable;
 import java.util.List;
+import java.util.Locale;
 import java.util.Map;
-import java.util.Properties;
 import java.util.Vector;
 
 
@@ -52,8 +51,7 @@ import java.util.Vector;
 */
 public final class LoggerRepositoryExImpl
         implements LoggerRepositoryEx,
-        RendererSupport,
-        UnrecognizedElementHandler {
+        RendererSupport {
 
     /**
      * Wrapped logger repository.
@@ -141,7 +139,7 @@ public final class LoggerRepositoryExImpl
     final LoggerRepositoryEventListener listener) {
     synchronized (repositoryEventListeners) {
       if (repositoryEventListeners.contains(listener)) {
-        LogLog.warn(
+        StatusLogger.getLogger().warn(
           "Ignoring attempt to add a previously "
                   + "registered LoggerRepositoryEventListener.");
       } else {
@@ -159,7 +157,7 @@ public final class LoggerRepositoryExImpl
     final LoggerRepositoryEventListener listener) {
     synchronized (repositoryEventListeners) {
       if (!repositoryEventListeners.contains(listener)) {
-        LogLog.warn(
+        StatusLogger.getLogger().warn(
           "Ignoring attempt to remove a "
                   + "non-registered LoggerRepositoryEventListener.");
       } else {
@@ -176,7 +174,7 @@ public final class LoggerRepositoryExImpl
   public void addLoggerEventListener(final LoggerEventListener listener) {
     synchronized (loggerEventListeners) {
       if (loggerEventListeners.get(listener) != null) {
-        LogLog.warn(
+        StatusLogger.getLogger().warn(
          "Ignoring attempt to add a previously registerd LoggerEventListener.");
       } else {
         HierarchyEventListenerProxy proxy =
@@ -208,7 +206,7 @@ public final class LoggerRepositoryExImpl
       HierarchyEventListenerProxy proxy =
               (HierarchyEventListenerProxy) loggerEventListeners.get(listener);
       if (proxy == null) {
-        LogLog.warn(
+        StatusLogger.getLogger().warn(
           "Ignoring attempt to remove a non-registered LoggerEventListener.");
       } else {
         loggerEventListeners.remove(listener);
@@ -221,7 +219,7 @@ public final class LoggerRepositoryExImpl
      * Issue warning that there are no appenders in hierarchy.
      * @param cat logger, not currently used.
      */
-  public void emitNoAppenderWarning(final Category cat) {
+  public void emitNoAppenderWarning(final Locale.Category cat) {
     repo.emitNoAppenderWarning(cat);
   }
 
@@ -319,7 +317,7 @@ public final class LoggerRepositoryExImpl
       @param logger The logger to which the appender was added.
       @param appender The appender added to the logger.
      */
-    public void fireAddAppenderEvent(final Category logger,
+    public void fireAddAppenderEvent(final Logger logger,
                                      final Appender appender) {
         repo.fireAddAppenderEvent(logger, appender);
     }
@@ -331,7 +329,7 @@ public final class LoggerRepositoryExImpl
       @param logger The logger from which the appender was removed.
       @param appender The appender removed from the logger.
       */
-    public void fireRemoveAppenderEvent(final Category logger,
+    public void fireRemoveAppenderEvent(final Logger logger,
                                         final Appender appender) {
        if (repo instanceof Hierarchy) {
            ((Hierarchy) repo).fireRemoveAppenderEvent(logger, appender);
@@ -410,7 +408,7 @@ public final class LoggerRepositoryExImpl
      {@link Enumeration}.
      @return enumerator of current loggers
    */
-  public Enumeration getCurrentLoggers() {
+  public Enumeration<Logger> getCurrentLoggers() {
     return repo.getCurrentLoggers();
   }
 
@@ -431,15 +429,6 @@ public final class LoggerRepositoryExImpl
   }
 
   /**
-   * Get enumerator over current loggers.
-   * @return enumerator over current loggers
-     @deprecated Please use {@link #getCurrentLoggers} instead.
-   */
-  public Enumeration getCurrentCategories() {
-    return repo.getCurrentCategories();
-  }
-
-  /**
      Get the renderer map for this hierarchy.
    @return renderer map
   */
@@ -583,32 +572,6 @@ public final class LoggerRepositoryExImpl
     return loggerFactory;
   }
 
-    /** {@inheritDoc} */
-    public boolean parseUnrecognizedElement(
-            final Element element,
-            final Properties props) throws Exception {
-        if ("plugin".equals(element.getNodeName())) {
-            Object instance =
-                    DOMConfigurator.parseElement(element, props, Plugin.class);
-            if (instance instanceof Plugin) {
-                Plugin plugin = (Plugin) instance;
-                String pluginName = DOMConfigurator.subst(element.getAttribute("name"), props);
-                if (pluginName.length() > 0) {
-                    plugin.setName(pluginName);
-                }
-                getPluginRegistry().addPlugin(plugin);
-                plugin.setLoggerRepository(this);
-
-                LogLog.debug("Pushing plugin on to the object stack.");
-                plugin.activateOptions();
-                return true;
-            }
-        }
-        return false;
-    }
-
-
-
     /**
      * Implementation of RendererSupportImpl if not
      * provided by LoggerRepository.
@@ -662,18 +625,18 @@ public final class LoggerRepositoryExImpl
        }
 
         /** {@inheritDoc} */
-       public void addAppenderEvent(final Category cat,
+       public void addAppenderEvent(final Logger cat,
                                     final Appender appender) {
-           if (isEnabled() && cat instanceof Logger) {
-                listener.appenderAddedEvent((Logger) cat, appender);
+           if (isEnabled() && cat != null) {
+                listener.appenderAddedEvent(cat, appender);
            }
        }
 
         /** {@inheritDoc} */
-       public void removeAppenderEvent(final Category cat,
+       public void removeAppenderEvent(final Logger cat,
                                     final Appender appender) {
-           if (isEnabled() && cat instanceof Logger) {
-                listener.appenderRemovedEvent((Logger) cat, appender);
+           if (isEnabled() && cat != null) {
+                listener.appenderRemovedEvent(cat, appender);
            }
        }
 

http://git-wip-us.apache.org/repos/asf/logging-chainsaw/blob/deb3b3c0/src/main/java/org/apache/log4j/chainsaw/ChainsawCyclicBufferTableModel.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/log4j/chainsaw/ChainsawCyclicBufferTableModel.java b/src/main/java/org/apache/log4j/chainsaw/ChainsawCyclicBufferTableModel.java
index 9bed427..b193b96 100644
--- a/src/main/java/org/apache/log4j/chainsaw/ChainsawCyclicBufferTableModel.java
+++ b/src/main/java/org/apache/log4j/chainsaw/ChainsawCyclicBufferTableModel.java
@@ -126,10 +126,10 @@ class ChainsawCyclicBufferTableModel extends AbstractTableModel
     Iterator iter = unfilteredCopy.iterator();
 
     while (iter.hasNext()) {
-      LoggingEventWrapper loggingEventWrapper = (LoggingEventWrapper) iter.next();
+      LogEventWrapper logEventWrapper = (LogEventWrapper) iter.next();
 
-      if (rule.evaluate(loggingEventWrapper.getLoggingEvent(), null)) {
-        list.add(loggingEventWrapper);
+      if (rule.evaluate(logEventWrapper.getLogEvent(), null)) {
+        list.add(logEventWrapper);
       }
     }
 
@@ -145,27 +145,27 @@ class ChainsawCyclicBufferTableModel extends AbstractTableModel
             previousSize = filteredList.size();
             filteredList.clear();
             if (ruleMediator == null) {
-                LoggingEventWrapper lastEvent = null;
+                LogEventWrapper lastEvent = null;
                 for (Iterator iter = unfilteredList.iterator();iter.hasNext();) {
-                    LoggingEventWrapper loggingEventWrapper = (LoggingEventWrapper)iter.next();
-                    loggingEventWrapper.setDisplayed(true);
-                    updateEventMillisDelta(loggingEventWrapper, lastEvent);
-                    filteredList.add(loggingEventWrapper);
-                    lastEvent = loggingEventWrapper;
+                    LogEventWrapper logEventWrapper = (LogEventWrapper)iter.next();
+                    logEventWrapper.setDisplayed(true);
+                    updateEventMillisDelta(logEventWrapper, lastEvent);
+                    filteredList.add(logEventWrapper);
+                    lastEvent = logEventWrapper;
                 }
             } else {
                 Iterator iter = unfilteredList.iterator();
-                LoggingEventWrapper lastEvent = null;
+                LogEventWrapper lastEvent = null;
                 while (iter.hasNext()) {
-                  LoggingEventWrapper loggingEventWrapper = (LoggingEventWrapper) iter.next();
+                  LogEventWrapper logEventWrapper = (LogEventWrapper) iter.next();
 
-                  if (ruleMediator.evaluate(loggingEventWrapper.getLoggingEvent(), null)) {
-                    loggingEventWrapper.setDisplayed(true);
-                    filteredList.add(loggingEventWrapper);
-                    updateEventMillisDelta(loggingEventWrapper, lastEvent);
-                    lastEvent = loggingEventWrapper;
+                  if (ruleMediator.evaluate(logEventWrapper.getLogEvent(), null)) {
+                    logEventWrapper.setDisplayed(true);
+                    filteredList.add(logEventWrapper);
+                    updateEventMillisDelta(logEventWrapper, lastEvent);
+                    lastEvent = logEventWrapper;
                   } else {
-                    loggingEventWrapper.setDisplayed(false);
+                    logEventWrapper.setDisplayed(false);
                   }
                 }
             }
@@ -210,25 +210,25 @@ class ChainsawCyclicBufferTableModel extends AbstractTableModel
     }
       if (searchForward) {
         for (int i = startLocation; i < filteredListCopy.size(); i++) {
-          if (rule.evaluate(((LoggingEventWrapper) filteredListCopy.get(i)).getLoggingEvent(), null)) {
+          if (rule.evaluate(((LogEventWrapper) filteredListCopy.get(i)).getLogEvent(), null)) {
             return i;
           }
         }
         //if there was no match, start at row zero and go to startLocation
         for (int i = 0; i < startLocation; i++) {
-          if (rule.evaluate(((LoggingEventWrapper) filteredListCopy.get(i)).getLoggingEvent(), null)) {
+          if (rule.evaluate(((LogEventWrapper) filteredListCopy.get(i)).getLogEvent(), null)) {
             return i;
           }
         }
       } else {
         for (int i = startLocation; i > -1; i--) {
-          if (rule.evaluate(((LoggingEventWrapper) filteredListCopy.get(i)).getLoggingEvent(), null)) {
+          if (rule.evaluate(((LogEventWrapper) filteredListCopy.get(i)).getLogEvent(), null)) {
             return i;
           }
         }
         //if there was no match, start at row list.size() - 1 and go to startLocation
         for (int i = filteredListCopy.size() - 1; i > startLocation; i--) {
-          if (rule.evaluate(((LoggingEventWrapper) filteredListCopy.get(i)).getLoggingEvent(), null)) {
+          if (rule.evaluate(((LogEventWrapper) filteredListCopy.get(i)).getLogEvent(), null)) {
             return i;
           }
         }
@@ -332,9 +332,9 @@ class ChainsawCyclicBufferTableModel extends AbstractTableModel
           sort = (sortEnabled && filteredListSize > 0);
         if (sort) {
             //reset display (used to ensure row height is updated)
-            LoggingEventWrapper lastEvent = null;
+            LogEventWrapper lastEvent = null;
             for (Iterator iter = filteredList.iterator();iter.hasNext();) {
-                LoggingEventWrapper e = (LoggingEventWrapper)iter.next();
+                LogEventWrapper e = (LogEventWrapper)iter.next();
                 e.setDisplayed(true);
                 updateEventMillisDelta(e, lastEvent);
                 lastEvent = e;
@@ -403,9 +403,9 @@ class ChainsawCyclicBufferTableModel extends AbstractTableModel
   	}
   }
   
-  public int getRowIndex(LoggingEventWrapper loggingEventWrapper) {
+  public int getRowIndex(LogEventWrapper logEventWrapper) {
     synchronized (mutex) {
-      return filteredList.indexOf(loggingEventWrapper);
+      return filteredList.indexOf(logEventWrapper);
     }
   }
 
@@ -418,16 +418,16 @@ class ChainsawCyclicBufferTableModel extends AbstractTableModel
             unfilteredListCopy = new ArrayList(unfilteredList);
         }
         for (int i=0;i<filteredListCopy.size();i++) {
-            LoggingEventWrapper loggingEventWrapper = (LoggingEventWrapper)filteredListCopy.get(i);
-            Object result = loggingEventWrapper.removeProperty(propName);
+            LogEventWrapper logEventWrapper = (LogEventWrapper)filteredListCopy.get(i);
+            Object result = logEventWrapper.removeProperty(propName);
             if (result != null) {
                 fireRowUpdated(i, false);
             }
         }
         //now remove the event from all events
         for (Iterator iter = unfilteredListCopy.iterator();iter.hasNext();) {
-            LoggingEventWrapper loggingEventWrapper = (LoggingEventWrapper)iter.next();
-            loggingEventWrapper.removeProperty(propName);
+            LogEventWrapper logEventWrapper = (LogEventWrapper)iter.next();
+            logEventWrapper.removeProperty(propName);
         }
     }
 
@@ -438,10 +438,10 @@ class ChainsawCyclicBufferTableModel extends AbstractTableModel
             unfilteredListCopy = new ArrayList(unfilteredList);
         }
         for (Iterator iter = unfilteredListCopy.iterator();iter.hasNext();) {
-            LoggingEventWrapper loggingEventWrapper = (LoggingEventWrapper) iter.next();
-            loggingEventWrapper.evaluateSearchRule(findRule);
+            LogEventWrapper logEventWrapper = (LogEventWrapper) iter.next();
+            logEventWrapper.evaluateSearchRule(findRule);
             //return the count of visible search matches
-            if (loggingEventWrapper.isSearchMatch() && loggingEventWrapper.isDisplayed()) {
+            if (logEventWrapper.isSearchMatch() && logEventWrapper.isDisplayed()) {
                 count++;
             }
         }
@@ -455,7 +455,7 @@ class ChainsawCyclicBufferTableModel extends AbstractTableModel
         }
         if (searchForward) {
           for (int i = startLocation; i < filteredListCopy.size(); i++) {
-            LoggingEventWrapper event = (LoggingEventWrapper)filteredListCopy.get(i);
+            LogEventWrapper event = (LogEventWrapper)filteredListCopy.get(i);
             if (!event.getColorRuleBackground().equals(ChainsawConstants.COLOR_DEFAULT_BACKGROUND) ||
                     !event.getColorRuleForeground().equals(ChainsawConstants.COLOR_DEFAULT_FOREGROUND)) {
                 return i;
@@ -463,7 +463,7 @@ class ChainsawCyclicBufferTableModel extends AbstractTableModel
           }
           //searching forward, no colorized event was found - now start at row zero and go to startLocation
           for (int i = 0; i < startLocation; i++) {
-            LoggingEventWrapper event = (LoggingEventWrapper)filteredListCopy.get(i);
+            LogEventWrapper event = (LogEventWrapper)filteredListCopy.get(i);
             if (!event.getColorRuleBackground().equals(ChainsawConstants.COLOR_DEFAULT_BACKGROUND) ||
                     !event.getColorRuleForeground().equals(ChainsawConstants.COLOR_DEFAULT_FOREGROUND)) {
                 return i;
@@ -471,7 +471,7 @@ class ChainsawCyclicBufferTableModel extends AbstractTableModel
           }
         } else {
           for (int i = startLocation; i > -1; i--) {
-              LoggingEventWrapper event = (LoggingEventWrapper)filteredListCopy.get(i);
+              LogEventWrapper event = (LogEventWrapper)filteredListCopy.get(i);
               if (!event.getColorRuleBackground().equals(ChainsawConstants.COLOR_DEFAULT_BACKGROUND) ||
                       !event.getColorRuleForeground().equals(ChainsawConstants.COLOR_DEFAULT_FOREGROUND)) {
                   return i;
@@ -479,7 +479,7 @@ class ChainsawCyclicBufferTableModel extends AbstractTableModel
           }
           //searching backward, no colorized event was found - now start at list.size() - 1 and go to startLocation
           for (int i = filteredListCopy.size() - 1; i > startLocation; i--) {
-              LoggingEventWrapper event = (LoggingEventWrapper)filteredListCopy.get(i);
+              LogEventWrapper event = (LogEventWrapper)filteredListCopy.get(i);
               if (!event.getColorRuleBackground().equals(ChainsawConstants.COLOR_DEFAULT_BACKGROUND) ||
                       !event.getColorRuleForeground().equals(ChainsawConstants.COLOR_DEFAULT_FOREGROUND)) {
                   return i;
@@ -494,7 +494,7 @@ class ChainsawCyclicBufferTableModel extends AbstractTableModel
     int searchMatchCount = 0;
     synchronized(mutex) {
       for (Iterator iter = filteredList.iterator();iter.hasNext();) {
-        LoggingEventWrapper wrapper = (LoggingEventWrapper) iter.next();
+        LogEventWrapper wrapper = (LogEventWrapper) iter.next();
         if (wrapper.isSearchMatch() && wrapper.isDisplayed()) {
           searchMatchCount++;
         }
@@ -511,10 +511,10 @@ class ChainsawCyclicBufferTableModel extends AbstractTableModel
       return (String) columnNames.get(column);
   }
 
-  public LoggingEventWrapper getRow(int row) {
+  public LogEventWrapper getRow(int row) {
     synchronized (mutex) {
       if (row < filteredList.size() && row > -1) {
-        return (LoggingEventWrapper) filteredList.get(row);
+        return (LogEventWrapper) filteredList.get(row);
       }
     }
 
@@ -532,7 +532,7 @@ class ChainsawCyclicBufferTableModel extends AbstractTableModel
 
     synchronized (mutex) {
       if (rowIndex < filteredList.size() && rowIndex > -1) {
-        event = ((LoggingEventWrapper) filteredList.get(rowIndex)).getLoggingEvent();
+        event = ((LogEventWrapper) filteredList.get(rowIndex)).getLogEvent();
       }
     }
 
@@ -619,19 +619,19 @@ class ChainsawCyclicBufferTableModel extends AbstractTableModel
     return "";
   }
 
-  public boolean isAddRow(LoggingEventWrapper loggingEventWrapper) {
-    Object id = loggingEventWrapper.getLoggingEvent().getProperty(Constants.LOG4J_ID_KEY);
+  public boolean isAddRow(LogEventWrapper logEventWrapper) {
+    Object id = logEventWrapper.getLogEvent().getProperty(Constants.LOG4J_ID_KEY);
 
     //only set the property if it doesn't already exist
     if (id == null) {
       id = new Integer(++uniqueRow);
-      loggingEventWrapper.setProperty(Constants.LOG4J_ID_KEY, id.toString());
+      logEventWrapper.setProperty(Constants.LOG4J_ID_KEY, id.toString());
     }
 
-    loggingEventWrapper.updateColorRuleColors(colorizer.getBackgroundColor(loggingEventWrapper.getLoggingEvent()), colorizer.getForegroundColor(loggingEventWrapper.getLoggingEvent()));
+    logEventWrapper.updateColorRuleColors(colorizer.getBackgroundColor(logEventWrapper.getLogEvent()), colorizer.getForegroundColor(logEventWrapper.getLogEvent()));
     Rule findRule = colorizer.getFindRule();
     if (findRule != null) {
-      loggingEventWrapper.evaluateSearchRule(colorizer.getFindRule());
+      logEventWrapper.evaluateSearchRule(colorizer.getFindRule());
     }
 
     boolean rowAdded = false;
@@ -650,48 +650,48 @@ class ChainsawCyclicBufferTableModel extends AbstractTableModel
             }
         }
         int unfilteredSize = unfilteredList.size();
-        LoggingEventWrapper lastLoggingEventWrapper = null;
+        LogEventWrapper lastLogEventWrapper = null;
         if (unfilteredSize > 0) {
-            lastLoggingEventWrapper = (LoggingEventWrapper) unfilteredList.get(unfilteredSize - 1);
+            lastLogEventWrapper = (LogEventWrapper) unfilteredList.get(unfilteredSize - 1);
         }
-        unfilteredList.add(loggingEventWrapper);
-        if ((ruleMediator == null) || (ruleMediator.evaluate(loggingEventWrapper.getLoggingEvent(), null))) {
-            loggingEventWrapper.setDisplayed(true);
-            updateEventMillisDelta(loggingEventWrapper, lastLoggingEventWrapper);
-            filteredList.add(loggingEventWrapper);
+        unfilteredList.add(logEventWrapper);
+        if ((ruleMediator == null) || (ruleMediator.evaluate(logEventWrapper.getLogEvent(), null))) {
+            logEventWrapper.setDisplayed(true);
+            updateEventMillisDelta(logEventWrapper, lastLogEventWrapper);
+            filteredList.add(logEventWrapper);
             rowAdded = true;
         } else {
-            loggingEventWrapper.setDisplayed(false);
+            logEventWrapper.setDisplayed(false);
         }
     }
 
-    checkForNewColumn(loggingEventWrapper);
+    checkForNewColumn(logEventWrapper);
 
     return rowAdded;
   }
 
-    private void updateEventMillisDelta(LoggingEventWrapper loggingEventWrapper, LoggingEventWrapper lastLoggingEventWrapper) {
-      if (lastLoggingEventWrapper != null) {
-        loggingEventWrapper.setPreviousDisplayedEventTimestamp(lastLoggingEventWrapper.getLoggingEvent().getTimeStamp());
+    private void updateEventMillisDelta(LogEventWrapper logEventWrapper, LogEventWrapper lastLogEventWrapper) {
+      if (lastLogEventWrapper != null) {
+        logEventWrapper.setPreviousDisplayedEventTimestamp(lastLogEventWrapper.getLogEvent().getTimeStamp());
       } else {
         //delta to same event = 0
-        loggingEventWrapper.setPreviousDisplayedEventTimestamp(loggingEventWrapper.getLoggingEvent().getTimeStamp());
+        logEventWrapper.setPreviousDisplayedEventTimestamp(logEventWrapper.getLogEvent().getTimeStamp());
       }
     }
 
-   private void checkForNewColumn(LoggingEventWrapper loggingEventWrapper)
+   private void checkForNewColumn(LogEventWrapper logEventWrapper)
    {
       /**
        * Is this a new Property key we haven't seen before?  Remember that now MDC has been merged
        * into the Properties collection
        */
-      boolean newColumn = uniquePropertyKeys.addAll(loggingEventWrapper.getPropertyKeySet());
+      boolean newColumn = uniquePropertyKeys.addAll(logEventWrapper.getPropertyKeySet());
 
       if (newColumn) {
         /**
          * If so, we should add them as columns and notify listeners.
          */
-        for (Iterator iter = loggingEventWrapper.getPropertyKeySet().iterator(); iter.hasNext();) {
+        for (Iterator iter = logEventWrapper.getPropertyKeySet().iterator(); iter.hasNext();) {
           String key = iter.next().toString().toUpperCase();
 
           //add all keys except the 'log4jid' key (columnNames is all-caps)
@@ -700,7 +700,7 @@ class ChainsawCyclicBufferTableModel extends AbstractTableModel
             logger.debug("Adding col '" + key + "', columnNames=" + columnNames);
             fireNewKeyColumnAdded(
               new NewKeyEvent(
-                this, columnNames.indexOf(key), key, loggingEventWrapper.getLoggingEvent().getProperty(key)));
+                this, columnNames.indexOf(key), key, logEventWrapper.getLogEvent().getProperty(key)));
           }
         }
       }
@@ -731,19 +731,19 @@ class ChainsawCyclicBufferTableModel extends AbstractTableModel
   }
 
     public void fireRowUpdated(int row, boolean checkForNewColumns) {
-        LoggingEventWrapper loggingEventWrapper = getRow(row);
-        if (loggingEventWrapper != null)
+        LogEventWrapper logEventWrapper = getRow(row);
+        if (logEventWrapper != null)
         {
-            loggingEventWrapper.updateColorRuleColors(colorizer.getBackgroundColor(loggingEventWrapper.getLoggingEvent()), colorizer.getForegroundColor(loggingEventWrapper.getLoggingEvent()));
+            logEventWrapper.updateColorRuleColors(colorizer.getBackgroundColor(logEventWrapper.getLogEvent()), colorizer.getForegroundColor(logEventWrapper.getLogEvent()));
             Rule findRule = colorizer.getFindRule();
             if (findRule != null) {
-              loggingEventWrapper.evaluateSearchRule(colorizer.getFindRule());
+              logEventWrapper.evaluateSearchRule(colorizer.getFindRule());
             }
 
             fireTableRowsUpdated(row, row);
             if (checkForNewColumns) {
                 //row may have had a column added..if so, make sure a column is added
-                checkForNewColumn(loggingEventWrapper);
+                checkForNewColumn(logEventWrapper);
             }
         }
     }
@@ -874,8 +874,8 @@ class ChainsawCyclicBufferTableModel extends AbstractTableModel
 
                   for (Iterator iter = unfilteredList.iterator();
                       iter.hasNext();) {
-                    LoggingEventWrapper loggingEventWrapper = (LoggingEventWrapper) iter.next();
-                    newUnfilteredList.add(loggingEventWrapper);
+                    LogEventWrapper logEventWrapper = (LogEventWrapper) iter.next();
+                    newUnfilteredList.add(logEventWrapper);
                     monitor.setProgress(index++);
                   }
 

http://git-wip-us.apache.org/repos/asf/logging-chainsaw/blob/deb3b3c0/src/main/java/org/apache/log4j/chainsaw/ColumnComparator.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/log4j/chainsaw/ColumnComparator.java b/src/main/java/org/apache/log4j/chainsaw/ColumnComparator.java
index 158f62b..aff5f73 100644
--- a/src/main/java/org/apache/log4j/chainsaw/ColumnComparator.java
+++ b/src/main/java/org/apache/log4j/chainsaw/ColumnComparator.java
@@ -43,12 +43,12 @@ public class ColumnComparator implements Comparator {
   public int compare(Object o1, Object o2) {
     int sort = 1;
 
-    if (o1 instanceof LoggingEventWrapper && o2 instanceof LoggingEventWrapper) {
+    if (o1 instanceof LogEventWrapper && o2 instanceof LogEventWrapper) {
 
 //		TODO not everything catered for here yet...
 
-      LoggingEvent e1 = ((LoggingEventWrapper) o1).getLoggingEvent();
-      LoggingEvent e2 = ((LoggingEventWrapper) o2).getLoggingEvent();
+      LoggingEvent e1 = ((LogEventWrapper) o1).getLogEvent();
+      LoggingEvent e2 = ((LogEventWrapper) o2).getLogEvent();
 
       switch (index + 1) {
       case ChainsawColumns.INDEX_LEVEL_COL_NAME:

http://git-wip-us.apache.org/repos/asf/logging-chainsaw/blob/deb3b3c0/src/main/java/org/apache/log4j/chainsaw/CopyEventsToClipboardAction.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/log4j/chainsaw/CopyEventsToClipboardAction.java b/src/main/java/org/apache/log4j/chainsaw/CopyEventsToClipboardAction.java
index e08d710..d3bf421 100644
--- a/src/main/java/org/apache/log4j/chainsaw/CopyEventsToClipboardAction.java
+++ b/src/main/java/org/apache/log4j/chainsaw/CopyEventsToClipboardAction.java
@@ -51,7 +51,7 @@ public class CopyEventsToClipboardAction extends AbstractAction {
         List filteredEvents = logUi.getCurrentLogPanel().getFilteredEvents();
         StringBuffer writer = new StringBuffer(filteredEvents.size() * EVENTSIZE_FUDGE_FACTOR);
         for (Iterator iterator = filteredEvents.iterator(); iterator.hasNext();) {
-            LoggingEvent event = ((LoggingEventWrapper) iterator.next()).getLoggingEvent();
+            LoggingEvent event = ((LogEventWrapper) iterator.next()).getLogEvent();
             writer.append(layout.format(event));
         }
 

http://git-wip-us.apache.org/repos/asf/logging-chainsaw/blob/deb3b3c0/src/main/java/org/apache/log4j/chainsaw/EventContainer.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/log4j/chainsaw/EventContainer.java b/src/main/java/org/apache/log4j/chainsaw/EventContainer.java
index db7ef82..92c8b02 100644
--- a/src/main/java/org/apache/log4j/chainsaw/EventContainer.java
+++ b/src/main/java/org/apache/log4j/chainsaw/EventContainer.java
@@ -114,14 +114,14 @@ public interface EventContainer extends SortTableModel, LoggerNameModel {
   /**
    * Returns the vector representing the row.
    */
-  LoggingEventWrapper getRow(int row);
+  LogEventWrapper getRow(int row);
 
   /**
    * Adds a row to the model.
    * @param e event
    * @return flag representing whether or not the row is being displayed (not filtered)
    */
-  boolean isAddRow(LoggingEventWrapper e);
+  boolean isAddRow(LogEventWrapper e);
 
   /**
    * Fire appropriate table update events for the range.
@@ -152,9 +152,9 @@ public interface EventContainer extends SortTableModel, LoggerNameModel {
 
   /**
    * Returns the index of the LoggingEventWrapper
-   * @param loggingEventWrapper
+   * @param logEventWrapper
    */
-  int getRowIndex(LoggingEventWrapper loggingEventWrapper);
+  int getRowIndex(LogEventWrapper logEventWrapper);
 
   /**
    * Remove property from all events in container

http://git-wip-us.apache.org/repos/asf/logging-chainsaw/blob/deb3b3c0/src/main/java/org/apache/log4j/chainsaw/FileSaveAction.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/log4j/chainsaw/FileSaveAction.java b/src/main/java/org/apache/log4j/chainsaw/FileSaveAction.java
index ae278e0..9685c02 100644
--- a/src/main/java/org/apache/log4j/chainsaw/FileSaveAction.java
+++ b/src/main/java/org/apache/log4j/chainsaw/FileSaveAction.java
@@ -117,9 +117,9 @@ class FileSaveAction extends AbstractAction {
       }
       Iterator iter = v.iterator();
       while (iter.hasNext()) {
-        LoggingEventWrapper loggingEventWrapper = (LoggingEventWrapper) iter.next();
-        layout.setLocationInfo(loggingEventWrapper.getLoggingEvent().getThrowableInformation() != null);
-        writer.write(layout.format(loggingEventWrapper.getLoggingEvent()));
+        LogEventWrapper logEventWrapper = (LogEventWrapper) iter.next();
+        layout.setLocationInfo(logEventWrapper.getLogEvent().getThrowableInformation() != null);
+        writer.write(layout.format(logEventWrapper.getLogEvent()));
       }
     } catch (IOException ioe) {
       LogLog.warn("Unable to save file", ioe);

http://git-wip-us.apache.org/repos/asf/logging-chainsaw/blob/deb3b3c0/src/main/java/org/apache/log4j/chainsaw/LogEventWrapper.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/log4j/chainsaw/LogEventWrapper.java b/src/main/java/org/apache/log4j/chainsaw/LogEventWrapper.java
new file mode 100644
index 0000000..53e972b
--- /dev/null
+++ b/src/main/java/org/apache/log4j/chainsaw/LogEventWrapper.java
@@ -0,0 +1,189 @@
+/*
+ * 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.log4j.chainsaw;
+
+import java.awt.Color;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.log4j.helpers.Constants;
+import org.apache.logging.log4j.core.LogEvent;
+
+/**
+ * Wrap access to a LogEvent.  All property updates need to go through this object and not through the wrapped logging event,
+ * since the properties are shared by two views of the same backing LogEvent, and logEvent itself creates a copy of passed-in properties..
+ *
+ * Property reads can be made on the actual LogEvent.
+ */
+public class LogEventWrapper {
+  private final LogEvent logEvent;
+  private static final int DEFAULT_HEIGHT = -1;
+
+  private Color colorRuleBackground = ChainsawConstants.COLOR_DEFAULT_BACKGROUND;
+  private Color colorRuleForeground = ChainsawConstants.COLOR_DEFAULT_FOREGROUND;
+  private int markerHeight = DEFAULT_HEIGHT;
+  private int msgHeight = DEFAULT_HEIGHT;
+
+  //set to the log4jid value via setId - assumed to never change
+  private int id;
+
+  private boolean searchMatch = false;
+  //a Map of event fields to Sets of string matches (can be used to render matches differently)
+  Map eventMatches = new HashMap();
+  private LogEventWrapper syncWrapper;
+  private boolean displayed;
+
+  public LogEventWrapper(LogEvent logEvent) {
+    this.logEvent = logEvent;
+  }
+
+  public LogEventWrapper(LogEventWrapper logEventWrapper) {
+    this.logEvent = logEventWrapper.getLogEvent();
+    this.id = logEventWrapper.id;
+    this.syncWrapper = logEventWrapper;
+    logEventWrapper.syncWrapper = this;
+  }
+
+  public LogEvent getLogEvent() {
+    return logEvent;
+  }
+
+  public void setProperty(String propName, String propValue) {
+    logEvent.setProperty(propName, propValue);
+    if (id == 0 && propName.equals(Constants.LOG4J_ID_KEY)) {
+      id = Integer.parseInt(propValue);
+    }
+    if (syncWrapper != null && !propName.equals(ChainsawConstants.MILLIS_DELTA_COL_NAME_LOWERCASE)) {
+      syncWrapper.getLogEvent().setProperty(propName, propValue);
+    }
+  }
+
+  public Object removeProperty(String propName) {
+    Object result = logEvent.removeProperty(propName);
+    if (syncWrapper != null && !propName.equals(ChainsawConstants.MILLIS_DELTA_COL_NAME_LOWERCASE)) {
+      syncWrapper.getLogEvent().removeProperty(propName);
+    }
+    return result;
+  }
+
+  public Set getPropertyKeySet() {
+    return logEvent.getPropertyKeySet();
+  }
+
+  public void updateColorRuleColors(Color backgroundColor, Color foregroundColor) {
+    if (backgroundColor != null && foregroundColor != null) {
+      this.colorRuleBackground = backgroundColor;
+      this.colorRuleForeground = foregroundColor;
+      if (syncWrapper != null) {
+        syncWrapper.colorRuleBackground = this.colorRuleBackground;
+        syncWrapper.colorRuleForeground = this.colorRuleForeground;
+      }
+    } else {
+      this.colorRuleBackground = ChainsawConstants.COLOR_DEFAULT_BACKGROUND;
+      this.colorRuleForeground = ChainsawConstants.COLOR_DEFAULT_FOREGROUND;
+      if (syncWrapper != null) {
+        syncWrapper.colorRuleBackground = this.colorRuleBackground;
+        syncWrapper.colorRuleForeground = this.colorRuleForeground;
+      }
+    }
+  }
+
+  public void evaluateSearchRule(Rule searchRule) {
+    eventMatches.clear();
+    searchMatch = searchRule != null && searchRule.evaluate(logEvent, eventMatches);
+  }
+
+  public Map getSearchMatches() {
+    return eventMatches;
+  }
+
+  public Color getForeground() {
+    return colorRuleForeground;
+  }
+
+  public Color getBackground() {
+    return colorRuleBackground;
+  }
+
+  public Color getColorRuleBackground() {
+    return colorRuleBackground;
+  }
+
+  public Color getColorRuleForeground() {
+    return colorRuleForeground;
+  }
+
+  public boolean isSearchMatch() {
+    return searchMatch;
+  }
+
+  public void setMarkerHeight(int markerHeight) {
+    this.markerHeight = markerHeight;
+  }
+
+  public int getMarkerHeight() {
+    return markerHeight;
+  }
+
+  public void setMsgHeight(int msgHeight) {
+    this.msgHeight = msgHeight;
+  }
+
+  public int getMsgHeight() {
+    return msgHeight;
+  }
+
+  public void setDisplayed(boolean b) {
+    markerHeight = DEFAULT_HEIGHT;
+    msgHeight = DEFAULT_HEIGHT;
+    displayed = b;
+  }
+
+  public void setPreviousDisplayedEventTimestamp(long previousDisplayedEventTimeStamp) {
+    setProperty(ChainsawConstants.MILLIS_DELTA_COL_NAME_LOWERCASE, String.valueOf(logEvent.getTimeStamp() - previousDisplayedEventTimeStamp));
+  }
+
+  public boolean isDisplayed() {
+    return displayed;
+  }
+
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+
+    LogEventWrapper that = (LogEventWrapper) o;
+
+    if (id != that.id) {
+      return false;
+    }
+
+    return true;
+  }
+
+  public int hashCode() {
+    return id;
+  }
+
+  public String toString() {
+    return "LoggingEventWrapper - id: " + id + " background: " + getBackground() + ", foreground: " + getForeground() + ", msg: " + logEvent.getMessage();
+  }
+}

http://git-wip-us.apache.org/repos/asf/logging-chainsaw/blob/deb3b3c0/src/main/java/org/apache/log4j/chainsaw/LogFilePatternLayoutBuilder.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/log4j/chainsaw/LogFilePatternLayoutBuilder.java b/src/main/java/org/apache/log4j/chainsaw/LogFilePatternLayoutBuilder.java
index 0112818..da4eac4 100644
--- a/src/main/java/org/apache/log4j/chainsaw/LogFilePatternLayoutBuilder.java
+++ b/src/main/java/org/apache/log4j/chainsaw/LogFilePatternLayoutBuilder.java
@@ -23,7 +23,6 @@ import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.Enumeration;
 import java.util.HashMap;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
@@ -34,27 +33,10 @@ import javax.xml.parsers.DocumentBuilderFactory;
 import javax.xml.parsers.ParserConfigurationException;
 
 import org.apache.log4j.chainsaw.messages.MessageCenter;
-import org.apache.log4j.helpers.OptionConverter;
-import org.apache.log4j.pattern.ClassNamePatternConverter;
-import org.apache.log4j.pattern.DatePatternConverter;
-import org.apache.log4j.pattern.FileLocationPatternConverter;
-import org.apache.log4j.pattern.FullLocationPatternConverter;
-import org.apache.log4j.pattern.LevelPatternConverter;
-import org.apache.log4j.pattern.LineLocationPatternConverter;
-import org.apache.log4j.pattern.LineSeparatorPatternConverter;
-import org.apache.log4j.pattern.LiteralPatternConverter;
-import org.apache.log4j.pattern.LoggerPatternConverter;
-import org.apache.log4j.pattern.LoggingEventPatternConverter;
-import org.apache.log4j.pattern.MessagePatternConverter;
-import org.apache.log4j.pattern.MethodLocationPatternConverter;
-import org.apache.log4j.pattern.NDCPatternConverter;
-import org.apache.log4j.pattern.PatternParser;
-import org.apache.log4j.pattern.PropertiesPatternConverter;
-import org.apache.log4j.pattern.RelativeTimePatternConverter;
-import org.apache.log4j.pattern.SequenceNumberPatternConverter;
-import org.apache.log4j.pattern.ThreadPatternConverter;
-import org.apache.log4j.xml.Log4jEntityResolver;
+import org.apache.logging.log4j.core.layout.PatternLayout;
+import org.apache.logging.log4j.core.pattern.*;
 import org.apache.log4j.xml.SAXErrorHandler;
+import org.apache.logging.log4j.core.util.OptionConverter;
 import org.w3c.dom.Document;
 import org.w3c.dom.NamedNodeMap;
 import org.w3c.dom.Node;
@@ -66,11 +48,10 @@ public class LogFilePatternLayoutBuilder
 {
     public static String getLogFormatFromPatternLayout(String patternLayout) {
         String input = OptionConverter.convertSpecialChars(patternLayout);
-        List converters = new ArrayList();
-        List fields = new ArrayList();
-        Map converterRegistry = null;
+        List<PatternConverter> converters = new ArrayList<>();
+        List<FormattingInfo> fields = new ArrayList<>();
 
-        PatternParser.parse(input, converters, fields, converterRegistry, PatternParser.getPatternLayoutRules());
+        new PatternParser(PatternLayout.KEY).parse(input, converters, fields, false, false);
         return getFormatFromConverters(converters);
     }
 
@@ -100,12 +81,11 @@ public class LogFilePatternLayoutBuilder
       return timestampFormat;
     }
   
-    private static String getFormatFromConverters(List converters) {
-        StringBuffer buffer = new StringBuffer();
-        for (Iterator iter = converters.iterator();iter.hasNext();) {
-            LoggingEventPatternConverter converter = (LoggingEventPatternConverter)iter.next();
+    private static String getFormatFromConverters(List<PatternConverter> converters) {
+        StringBuilder buffer = new StringBuilder();
+        for (PatternConverter converter : converters) {
             if (converter instanceof DatePatternConverter) {
-              buffer.append("TIMESTAMP");
+                buffer.append("TIMESTAMP");
             } else if (converter instanceof MessagePatternConverter) {
                 buffer.append("MESSAGE");
             } else if (converter instanceof LoggerPatternConverter) {
@@ -114,14 +94,14 @@ public class LogFilePatternLayoutBuilder
                 buffer.append("CLASS");
             } else if (converter instanceof RelativeTimePatternConverter) {
                 buffer.append("PROP(RELATIVETIME)");
-            } else if (converter instanceof ThreadPatternConverter) {
+            } else if (converter instanceof ThreadNamePatternConverter) {
                 buffer.append("THREAD");
-            } else if (converter instanceof NDCPatternConverter) {
+            } else if (converter instanceof NdcPatternConverter) {
                 buffer.append("NDC");
             } else if (converter instanceof LiteralPatternConverter) {
                 LiteralPatternConverter literal = (LiteralPatternConverter)converter;
                 //format shouldn't normally take a null, but we're getting a literal, so passing in the buffer will work
-                literal.format(null, buffer);
+                literal.format(buffer);
             } else if (converter instanceof SequenceNumberPatternConverter) {
                 buffer.append("PROP(log4jid)");
             } else if (converter instanceof LevelPatternConverter) {
@@ -134,13 +114,13 @@ public class LogFilePatternLayoutBuilder
                 buffer.append("LINE");
             } else if (converter instanceof FileLocationPatternConverter) {
                 buffer.append("FILE");
-            } else if (converter instanceof PropertiesPatternConverter) {
+            } else if (converter instanceof MdcPatternConverter) {
 //                PropertiesPatternConverter propertiesConverter = (PropertiesPatternConverter) converter;
 //                String option = propertiesConverter.getOption();
 //                if (option != null && option.length() > 0) {
 //                    buffer.append("PROP(" + option + ")");
 //                } else {
-                    buffer.append("PROP(PROPERTIES)");
+                buffer.append("PROP(PROPERTIES)");
 //                }
             } else if (converter instanceof LineSeparatorPatternConverter) {
                 //done
@@ -152,11 +132,7 @@ public class LogFilePatternLayoutBuilder
   public static Map getAppenderConfiguration(File file) {
     try {
       return getXMLFileAppenderConfiguration(file);
-    } catch (IOException e) {
-      //ignore
-    } catch (ParserConfigurationException e) {
-      //ignore
-    } catch (SAXException e) {
+    } catch (IOException | ParserConfigurationException | SAXException e) {
       //ignore
     }
     try {
@@ -169,7 +145,7 @@ public class LogFilePatternLayoutBuilder
   }
 
   public static Map getPropertiesFileAppenderConfiguration(File propertyFile) throws IOException, ParserConfigurationException, SAXException {
-    Map result = new HashMap();
+    Map<String, Map<String, String>> result = new HashMap<>();
     String appenderPrefix = "log4j.appender";
     Properties props = new Properties();
     FileInputStream inputStream = null;
@@ -177,7 +153,7 @@ public class LogFilePatternLayoutBuilder
       inputStream = new FileInputStream(propertyFile);
       props.load(inputStream);
       Enumeration propertyNames = props.propertyNames();
-      Map appenders = new HashMap();
+      Map<String, String> appenders = new HashMap<>();
       while (propertyNames.hasMoreElements()) {
         String propertyName = propertyNames.nextElement().toString();
         if (propertyName.startsWith(appenderPrefix)) {
@@ -188,24 +164,23 @@ public class LogFilePatternLayoutBuilder
           }
         }
       }
-      for (Iterator iter = appenders.entrySet().iterator();iter.hasNext();) {
-        Map.Entry appenderEntry = (Map.Entry)iter.next();
-        String appenderName = appenderEntry.getKey().toString();
-        String appenderClassName = appenderEntry.getValue().toString();
-        if (appenderClassName.toLowerCase(Locale.ENGLISH).endsWith("fileappender")) {
-          String layout = props.getProperty(appenderPrefix + "." + appenderName + ".layout");
-          if (layout != null && layout.trim().equals("org.apache.log4j.PatternLayout")) {
-            String conversion = props.getProperty(appenderPrefix + "." + appenderName + ".layout.ConversionPattern");
-            String file = props.getProperty(appenderPrefix + "." + appenderName + ".File");
-            if (conversion != null && file != null) {
-              Map entry = new HashMap();
-              entry.put("file", file.trim());
-              entry.put("conversion", conversion.trim());
-              result.put(appenderName, entry);
+        for (Map.Entry<String, String> appenderEntry : appenders.entrySet()) {
+            String appenderName = appenderEntry.getKey();
+            String appenderClassName = appenderEntry.getValue();
+            if (appenderClassName.toLowerCase(Locale.ENGLISH).endsWith("fileappender")) {
+                String layout = props.getProperty(appenderPrefix + "." + appenderName + ".layout");
+                if (layout != null && layout.trim().equals("org.apache.log4j.PatternLayout")) {
+                    String conversion = props.getProperty(appenderPrefix + "." + appenderName + ".layout.ConversionPattern");
+                    String file = props.getProperty(appenderPrefix + "." + appenderName + ".File");
+                    if (conversion != null && file != null) {
+                        Map<String, String> entry = new HashMap<>();
+                        entry.put("file", file.trim());
+                        entry.put("conversion", conversion.trim());
+                        result.put(appenderName, entry);
+                    }
+                }
             }
-          }
         }
-      }
           /*
           example:
           log4j.appender.R=org.apache.log4j.RollingFileAppender
@@ -228,69 +203,65 @@ public class LogFilePatternLayoutBuilder
   }
 
   private static Map getXMLFileAppenderConfiguration(File file) throws IOException, ParserConfigurationException, SAXException {
-    InputStream stream = file.toURI().toURL().openStream();
-    Map result = new HashMap();
-    try {
-      InputSource src = new InputSource(stream);
-      src.setSystemId(file.toURI().toURL().toString());
-      DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
-      DocumentBuilder docBuilder = dbf.newDocumentBuilder();
+      Map<String, Map<String, String>> result = new HashMap<>();
+      try (InputStream stream = file.toURI().toURL().openStream()) {
+          InputSource src = new InputSource(stream);
+          src.setSystemId(file.toURI().toURL().toString());
+          DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+          DocumentBuilder docBuilder = dbf.newDocumentBuilder();
 
-      docBuilder.setErrorHandler(new SAXErrorHandler());
-      docBuilder.setEntityResolver(new Log4jEntityResolver());
-      Document doc = docBuilder.parse(src);
-      NodeList appenders = doc.getElementsByTagName("appender");
-      for (int i = 0; i < appenders.getLength(); i++) {
-        Node appender = appenders.item(i);
-        NamedNodeMap appenderAttributes = appender.getAttributes();
+          docBuilder.setErrorHandler(new SAXErrorHandler());
+          Document doc = docBuilder.parse(src);
+          NodeList appenders = doc.getElementsByTagName("appender");
+          for (int i = 0; i < appenders.getLength(); i++) {
+              Node appender = appenders.item(i);
+              NamedNodeMap appenderAttributes = appender.getAttributes();
 //        Class appenderClass = Class.forName(map.getNamedItem("class").getNodeValue());
-        Node appenderClass = appenderAttributes.getNamedItem("class");
-        if (appenderAttributes.getNamedItem("name") != null && appenderClass != null && appenderClass.getNodeValue() != null) {
-          //all log4j fileappenders end in fileappender..if a custom fileappender also ends in fileappender and uses the same dom nodes to be loaded,
-          //try to parse the nodes as well
-          if (appenderClass.getNodeValue().toLowerCase(Locale.ENGLISH).endsWith("fileappender")) {
-            String appenderName = appenderAttributes.getNamedItem("name").getNodeValue();
-            //subclass of FileAppender - add it
-            Map entry = new HashMap();
-            NodeList appenderChildren = appender.getChildNodes();
-            for (int j = 0; j < appenderChildren.getLength(); j++) {
-              Node appenderChild = appenderChildren.item(j);
-              if (appenderChild.getNodeName().equals("param") && appenderChild.hasAttributes()) {
-                Node fileNameNode = appenderChild.getAttributes().getNamedItem("name");
-                if (fileNameNode != null && fileNameNode.getNodeValue().equalsIgnoreCase("file")) {
-                  Node fileValueNode = appenderChild.getAttributes().getNamedItem("value");
-                  if (fileValueNode != null) {
-                    entry.put("file", fileValueNode.getNodeValue());
-                  }
-                }
-              }
-              if (appenderChild.getNodeName().equalsIgnoreCase("layout") && appenderChild.hasAttributes()) {
-                NamedNodeMap layoutAttributes = appenderChild.getAttributes();
-                Node layoutNode = layoutAttributes.getNamedItem("class");
-                if (layoutNode != null && layoutNode.getNodeValue() != null && layoutNode.getNodeValue().equalsIgnoreCase("org.apache.log4j.PatternLayout")) {
-                  NodeList layoutChildren = appenderChild.getChildNodes();
-                  for (int k = 0; k < layoutChildren.getLength(); k++) {
-                    Node layoutChild = layoutChildren.item(k);
-                    if (layoutChild.getNodeName().equals("param") && layoutChild.hasAttributes()) {
-                      Node layoutName = layoutChild.getAttributes().getNamedItem("name");
-                      if (layoutName != null && layoutName.getNodeValue() != null && layoutName.getNodeValue().equalsIgnoreCase("conversionpattern")) {
-                        Node conversionValue = layoutChild.getAttributes().getNamedItem("value");
-                        if (conversionValue != null) {
-                          entry.put("conversion", conversionValue.getNodeValue());
-                        }
+              Node appenderClass = appenderAttributes.getNamedItem("class");
+              if (appenderAttributes.getNamedItem("name") != null && appenderClass != null && appenderClass.getNodeValue() != null) {
+                  //all log4j fileappenders end in fileappender..if a custom fileappender also ends in fileappender and uses the same dom nodes to be loaded,
+                  //try to parse the nodes as well
+                  if (appenderClass.getNodeValue().toLowerCase(Locale.ENGLISH).endsWith("fileappender")) {
+                      String appenderName = appenderAttributes.getNamedItem("name").getNodeValue();
+                      //subclass of FileAppender - add it
+                      Map<String, String> entry = new HashMap<>();
+                      NodeList appenderChildren = appender.getChildNodes();
+                      for (int j = 0; j < appenderChildren.getLength(); j++) {
+                          Node appenderChild = appenderChildren.item(j);
+                          if (appenderChild.getNodeName().equals("param") && appenderChild.hasAttributes()) {
+                              Node fileNameNode = appenderChild.getAttributes().getNamedItem("name");
+                              if (fileNameNode != null && fileNameNode.getNodeValue().equalsIgnoreCase("file")) {
+                                  Node fileValueNode = appenderChild.getAttributes().getNamedItem("value");
+                                  if (fileValueNode != null) {
+                                      entry.put("file", fileValueNode.getNodeValue());
+                                  }
+                              }
+                          }
+                          if (appenderChild.getNodeName().equalsIgnoreCase("layout") && appenderChild.hasAttributes()) {
+                              NamedNodeMap layoutAttributes = appenderChild.getAttributes();
+                              Node layoutNode = layoutAttributes.getNamedItem("class");
+                              if (layoutNode != null && layoutNode.getNodeValue() != null && layoutNode.getNodeValue().equalsIgnoreCase("org.apache.log4j.PatternLayout")) {
+                                  NodeList layoutChildren = appenderChild.getChildNodes();
+                                  for (int k = 0; k < layoutChildren.getLength(); k++) {
+                                      Node layoutChild = layoutChildren.item(k);
+                                      if (layoutChild.getNodeName().equals("param") && layoutChild.hasAttributes()) {
+                                          Node layoutName = layoutChild.getAttributes().getNamedItem("name");
+                                          if (layoutName != null && layoutName.getNodeValue() != null && layoutName.getNodeValue().equalsIgnoreCase("conversionpattern")) {
+                                              Node conversionValue = layoutChild.getAttributes().getNamedItem("value");
+                                              if (conversionValue != null) {
+                                                  entry.put("conversion", conversionValue.getNodeValue());
+                                              }
+                                          }
+                                      }
+                                  }
+                              }
+                          }
                       }
-                    }
+                      result.put(appenderName, entry);
                   }
-                }
               }
-            }
-            result.put(appenderName, entry);
           }
-        }
       }
-    } finally {
-      stream.close();
-    }
     MessageCenter.getInstance().getLogger().info("getXMLFileAppenderConfiguration for file: " + file + ", result: " + result);
     return result;
   }