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:28 UTC

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

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();