Try to upgrade to Log4j 2
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> -
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.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 @@ */ public final class LoggerRepositoryExImpl implements LoggerRepositoryEx, - RendererSupport, - UnrecognizedElementHandler { + RendererSupport { /** * Wrapped logger repository. @@ -141,7 +139,7 @@ public void addLoggerRepositoryEventListener( 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 void removeLoggerRepositoryEventListener( 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 void removeLoggerRepositoryEventListener( 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 void removeLoggerEventListener(final LoggerEventListener listener) { 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 void removeLoggerEventListener(final LoggerEventListener listener) { * 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 PluginRegistry getPluginRegistry() { @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 void fireAddAppenderEvent(final Category logger, @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 Logger getLogger(final String loggerName, {@link Enumeration}. @return enumerator of current loggers */ - public Enumeration getCurrentLoggers() { + public Enumeration<Logger> getCurrentLoggers() { return repo.getCurrentLoggers(); } @@ -431,15 +429,6 @@ public void addErrorItem(final ErrorItem errorItem) { } /** - * 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 LoggerFactory getLoggerFactory() { 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 HierarchyEventListenerProxy(final LoggerEventListener l) { } /** {@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); } }
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 @@ public List getMatchingEvents(Rule rule) { 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 @@ public void reFilter() { 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 @@ public int locate(Rule rule, int startLocation, boolean searchForward) { } 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 @@ public void sort() { 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 @@ public List getFilteredEvents() { } } - public int getRowIndex(LoggingEventWrapper loggingEventWrapper) { + public int getRowIndex(LogEventWrapper logEventWrapper) { synchronized (mutex) { - return filteredList.indexOf(loggingEventWrapper); + return filteredList.indexOf(logEventWrapper); } } @@ -418,16 +418,16 @@ public void removePropertyFromEvents(String propName) { 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 @@ public int updateEventsWithFindRule(Rule findRule) { 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 @@ public int findColoredRow(int startLocation, boolean searchForward) { } 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 @@ public int findColoredRow(int startLocation, boolean searchForward) { } //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 @@ public int findColoredRow(int startLocation, boolean searchForward) { } } 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 @@ public int findColoredRow(int startLocation, boolean searchForward) { } //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 @@ public int getSearchMatchCount() { 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 @@ public String getColumnName(int column) { 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 @@ public Object getValueAt(int rowIndex, int columnIndex) { synchronized (mutex) { if (rowIndex < filteredList.size() && rowIndex > -1) { - event = ((LoggingEventWrapper) filteredList.get(rowIndex)).getLoggingEvent(); + event = ((LogEventWrapper) filteredList.get(rowIndex)).getLogEvent(); } } @@ -619,19 +619,19 @@ public Object getValueAt(int rowIndex, int columnIndex) { 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 @@ public boolean isAddRow(LoggingEventWrapper loggingEventWrapper) { } } 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 @@ private void checkForNewColumn(LoggingEventWrapper loggingEventWrapper) 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 @@ public void run() { } 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 @@ public void run() { 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++); }
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 ColumnComparator(String columnName, int index, boolean ascending) { 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:
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 void actionPerformed(ActionEvent e) { 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)); }
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 @@ void addPropertyChangeListener( /** * 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 @@ void addPropertyChangeListener( /** * 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
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 @@ public void actionPerformed(ActionEvent e) { } 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);
diff --git a/src/main/java/org/apache/log4j/chainsaw/LoggingEventWrapper.java b/src/main/java/org/apache/log4j/chainsaw/LogEventWrapper.java similarity index 76% rename from src/main/java/org/apache/log4j/chainsaw/LoggingEventWrapper.java rename to src/main/java/org/apache/log4j/chainsaw/LogEventWrapper.java index 63363a3..53e972b 100644 --- a/src/main/java/org/apache/log4j/chainsaw/LoggingEventWrapper.java +++ b/src/main/java/org/apache/log4j/chainsaw/LogEventWrapper.java
@@ -22,17 +22,16 @@ import java.util.Set; import org.apache.log4j.helpers.Constants; -import org.apache.log4j.rule.Rule; -import org.apache.log4j.spi.LoggingEvent; +import org.apache.logging.log4j.core.LogEvent; /** - * 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.. + * 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 LoggingEvent. + * Property reads can be made on the actual LogEvent. */ -public class LoggingEventWrapper { - private final LoggingEvent loggingEvent; +public class LogEventWrapper { + private final LogEvent logEvent; private static final int DEFAULT_HEIGHT = -1; private Color colorRuleBackground = ChainsawConstants.COLOR_DEFAULT_BACKGROUND; @@ -46,44 +45,44 @@ public class LoggingEventWrapper { 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 LogEventWrapper syncWrapper; private boolean displayed; - public LoggingEventWrapper(LoggingEvent loggingEvent) { - this.loggingEvent = loggingEvent; + public LogEventWrapper(LogEvent logEvent) { + this.logEvent = logEvent; } - public LoggingEventWrapper(LoggingEventWrapper loggingEventWrapper) { - this.loggingEvent = loggingEventWrapper.getLoggingEvent(); - this.id = loggingEventWrapper.id; - this.syncWrapper = loggingEventWrapper; - loggingEventWrapper.syncWrapper = this; + public LogEventWrapper(LogEventWrapper logEventWrapper) { + this.logEvent = logEventWrapper.getLogEvent(); + this.id = logEventWrapper.id; + this.syncWrapper = logEventWrapper; + logEventWrapper.syncWrapper = this; } - public LoggingEvent getLoggingEvent() { - return loggingEvent; + public LogEvent getLogEvent() { + return logEvent; } public void setProperty(String propName, String propValue) { - loggingEvent.setProperty(propName, 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.getLoggingEvent().setProperty(propName, propValue); + syncWrapper.getLogEvent().setProperty(propName, propValue); } } public Object removeProperty(String propName) { - Object result = loggingEvent.removeProperty(propName); + Object result = logEvent.removeProperty(propName); if (syncWrapper != null && !propName.equals(ChainsawConstants.MILLIS_DELTA_COL_NAME_LOWERCASE)) { - syncWrapper.getLoggingEvent().removeProperty(propName); + syncWrapper.getLogEvent().removeProperty(propName); } return result; } public Set getPropertyKeySet() { - return loggingEvent.getPropertyKeySet(); + return logEvent.getPropertyKeySet(); } public void updateColorRuleColors(Color backgroundColor, Color foregroundColor) { @@ -106,7 +105,7 @@ public void updateColorRuleColors(Color backgroundColor, Color foregroundColor) public void evaluateSearchRule(Rule searchRule) { eventMatches.clear(); - searchMatch = searchRule != null && searchRule.evaluate(loggingEvent, eventMatches); + searchMatch = searchRule != null && searchRule.evaluate(logEvent, eventMatches); } public Map getSearchMatches() { @@ -156,7 +155,7 @@ public void setDisplayed(boolean b) { } public void setPreviousDisplayedEventTimestamp(long previousDisplayedEventTimeStamp) { - setProperty(ChainsawConstants.MILLIS_DELTA_COL_NAME_LOWERCASE, String.valueOf(loggingEvent.getTimeStamp() - previousDisplayedEventTimeStamp)); + setProperty(ChainsawConstants.MILLIS_DELTA_COL_NAME_LOWERCASE, String.valueOf(logEvent.getTimeStamp() - previousDisplayedEventTimeStamp)); } public boolean isDisplayed() { @@ -171,7 +170,7 @@ public boolean equals(Object o) { return false; } - LoggingEventWrapper that = (LoggingEventWrapper) o; + LogEventWrapper that = (LogEventWrapper) o; if (id != that.id) { return false; @@ -185,6 +184,6 @@ public int hashCode() { } public String toString() { - return "LoggingEventWrapper - id: " + id + " background: " + getBackground() + ", foreground: " + getForeground() + ", msg: " + loggingEvent.getMessage(); + return "LoggingEventWrapper - id: " + id + " background: " + getBackground() + ", foreground: " + getForeground() + ", msg: " + logEvent.getMessage(); } }
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.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.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 static String getTimeStampFormat(String patternLayout) { 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 @@ private static String getFormatFromConverters(List converters) { 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 @@ private static String getFormatFromConverters(List converters) { 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 @@ private static String getFormatFromConverters(List converters) { 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 static Map getAppenderConfiguration(File file) { } 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 static Map getPropertiesFileAppenderConfiguration(File propertyFile) thro 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 static Map getPropertiesFileAppenderConfiguration(File propertyFile) thro } } } - 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 static Map getPropertiesFileAppenderConfiguration(File propertyFile) thro } 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; }
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 void actionPerformed(ActionEvent e) { 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 void actionPerformed(ActionEvent e) { 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 void valueChanged(ListSelectionEvent evt) { //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 void run() { //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 void actionPerformed(ActionEvent e) { 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 @@ private String getValueOf(int row, int column) { //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 void run() { } 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 void run() { //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 void run() { } 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 void run() { */ private void setDetailPaneConversionPattern(String conversionPattern) { String oldPattern = getDetailPaneConversionPattern(); - (detailLayout).setConversionPattern(conversionPattern); + detailLayout.setConversionPattern(conversionPattern); firePropertyChange( "detailPaneConversionPattern", oldPattern, getDetailPaneConversionPattern()); @@ -2991,7 +2989,7 @@ private void setDetailPaneConversionPattern(String conversionPattern) { * @return conversionPattern layout text */ private String getDetailPaneConversionPattern() { - return (detailLayout).getConversionPattern(); + return detailLayout.getConversionPattern(); } /** @@ -3247,9 +3245,9 @@ private int getMaxColumnWidth(int index) { 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 void clearAllMarkers() { 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 void mouseClicked(MouseEvent evt) { 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 void mouseMoved(MouseEvent evt) { currentRow = row; - LoggingEventWrapper event = detailEventContainer.getRow(currentRow); + LogEventWrapper event = detailEventContainer.getRow(currentRow); if (event != null) { String toolTipText = getToolTipTextForEvent(event); @@ -3648,14 +3646,14 @@ private void updateDetailPane(boolean force) { 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 void run() { } } - 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 void mouseClicked(MouseEvent e) 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 @@ private class MarkerCellEditor implements TableCellEditor { 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 boolean shouldSelectCell(EventObject anEvent) 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 boolean stopCellEditing() 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 void cancelCellEditing() for (Iterator iter = cellEditorListenersCopy.iterator();iter.hasNext();) { ((CellEditorListener)iter.next()).editingCanceled(event); } - currentLoggingEventWrapper = null; + currentLogEventWrapper = null; currentTable = null; } @@ -3840,9 +3838,9 @@ public void removeCellEditorListener(CellEditorListener l) 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 EventTimeDeltaMatchThumbnail() { } 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 @@ private void initializeLists() { 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 void paintComponent(Graphics g) { 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 ColorizedEventAndSearchMatchThumbnail() { } 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 @@ private void configureColors() { 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 void paintComponent(Graphics g) { //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 void paintComponent(Graphics g) { 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 void paintComponent(Graphics g) { //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 void paintComponent(Graphics g) { 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 void mouseMoved(MouseEvent e) { 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 void mouseClicked(MouseEvent e) 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 void tableChanged(TableModelEvent e) { 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 void tableChanged(TableModelEvent e) { // 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 @@ protected void drawEvent(Color newColor, int verticalLocation, int eventHeight, 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 boolean equals(Object o) { 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 boolean equals(Object o) { } public int hashCode() { - return loggingEventWrapper != null ? loggingEventWrapper.hashCode() : 0; + return logEventWrapper != null ? logEventWrapper.hashCode() : 0; } }
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.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.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.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 PermissionCollection getPermissions(CodeSource codesource) { 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 void createCustomExpressionLogPanel(String ident) { 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()); } }
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 Component getTableCellRendererComponent( 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 Component getTableCellRendererComponent( 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 Component getTableCellRendererComponent( 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 Component getTableCellRendererComponent( } 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 Component getTableCellRendererComponent( //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 Component getTableCellRendererComponent( 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 Component getTableCellRendererComponent( 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 @@ void setLoggerPrecision(String loggerPrecisionText) { * * @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 @@ private Object formatField(Object field, LoggingEventWrapper loggingEventWrapper 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);
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 @@ * 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;
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());
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.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; /**
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.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!)
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 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; /**
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 @@ * 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 <psmith@apache.org> */ -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 <, > & and " as their entities. It is very * dumb about & 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 @@ private static String escape(String string) { 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 @@ private static String escape(String string) { switch (c) { case '<': buf.append("<"); - break; case '>': buf.append(">"); - break; case '\"': buf.append("""); - break; case '&': buf.append("&"); - break; default: buf.append(c); - - break; } } @@ -171,109 +98,65 @@ private static String escape(String string) { } /** - * 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); } } }
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.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.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 <psmith@apache.org> * @@ -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 LayoutEditorPane() { setupListeners(); } - /** - * @return - */ private Action createCutAction() { final Action action = new AbstractAction("Cut", ChainsawIcons.ICON_CUT) { @@ -110,9 +111,6 @@ public void actionPerformed(ActionEvent e) { return action; } - /** - * @return - */ private Action createCopyAction() { final Action action = new AbstractAction("Copy", ChainsawIcons.ICON_COPY) { @@ -126,9 +124,6 @@ public void actionPerformed(ActionEvent e) { return action; } - /** - * - */ private void setupListeners() { patternEditor.getDocument().addDocumentListener( new DocumentListener() { @@ -172,28 +167,29 @@ private void updateTextActions(boolean enabled) { * */ private void createEvent() { - Hashtable hashTable = new Hashtable(); - hashTable.put("key1", "val1"); - hashTable.put("key2", "val2"); - hashTable.put("key3", "val3"); + Map<String, String> contextMap = new HashMap<>(3); + contextMap.put("key1", "val1"); + contextMap.put("key2", "val2"); + contextMap.put("key3", "val3"); - LocationInfo li = - new LocationInfo( - "myfile.java", "com.mycompany.util.MyClass", "myMethod", "321"); + StackTraceElement li = + new StackTraceElement( + "myfile.java", "com.mycompany.util.MyClass", "myMethod", 321); - ThrowableInformation tsr = new ThrowableInformation(new Exception()); + ThrowableProxy tsr = new ThrowableProxy(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); - + 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(); } /**
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.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 @@ */ 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 LayoutListCellRenderer(Layout layout) { 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(
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.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 @@ */ 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");
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.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;
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.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.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 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 @@ */ 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 @@ private Receiver getReceiver(ServiceInfo info) { 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; }
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.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 @@ * @author Ceki Gülcü * */ -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 boolean isPaused() { 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; - } - }
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 @@ public void execute() { 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 @@ public void execute() { 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 @@ void closeConnection(Connection connection) { * @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 @@ void getProperties(Connection connection, long id, LoggingEvent event) 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 @@ void getProperties(Connection connection, long id, LoggingEvent event) * @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 @@ ThrowableInformation getException(Connection connection, long id) 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();
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 @@ 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; - //INFO level defined in parent as 20000..no need to redefine here - + /** + * Numerical value for INFO. + */ + private static final int INFO_INT = 20000; + /** * 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.
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 <sdeboy@apache.org> - * - */ -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; - } -}
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.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 <mmhohman@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 void removeSocketNodeEventListener( * 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 void run() { 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 void run() { // 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 {
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.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 void setPaused(final boolean b) { } } /** {@inheritDoc} */ - public void doPost(final LoggingEvent event) { + public void doPost(final LogEvent event) { if (!isPaused()) { super.doPost(event); }
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 <sdeboy@apache.org> - */ -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; - } -}
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; + } +}
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ülcü + @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(); + } + } +}
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ülcü + @since 1.0 */ +public interface ObjectRenderer { + + /** + Render the object passed as parameter as a String. + */ + public + String doRender(Object o); +}
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ülcü + @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); + } +}
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 @@ void removePropertyChangeListener( * 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);
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 @@ protected Receiver() { } /** - * 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 Level getThreshold() { */ public boolean isAsSevereAsThreshold(final Level level) { return ((thresholdLevel == null) - || level.isGreaterOrEqual(thresholdLevel)); + || level.isLessSpecificThan(thresholdLevel)); } /** @@ -109,7 +109,7 @@ public boolean isAsSevereAsThreshold(final Level level) { * * @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 void doPost(final LoggingEvent event) { // 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); }
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; - } - - } -}
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; - } - - - -}
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; - } -}
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; - } - -}
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); -}
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; /**
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); }
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ülcü + @since 1.2 + + */ +public interface HierarchyEventListener { + + void addAppenderEvent(Logger logger, Appender appender); + + void removeAppenderEvent(Logger logger, Appender appender); + +}
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 void info(final Object msg, final Throwable t) { * {@inheritDoc} */ public boolean isWarnEnabled() { - return logger.isEnabledFor(Level.WARN); + return logger.isEnabled(Level.WARN); } /** @@ -157,7 +157,7 @@ public void warn(final Object msg) { */ 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 void warn(final Object parameterizedMsg, 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 void warn(final Object msg, final Throwable t) { * {@inheritDoc} */ public boolean isErrorEnabled() { - return logger.isEnabledFor(Level.ERROR); + return logger.isEnabled(Level.ERROR); } /** @@ -201,7 +201,7 @@ public void error(final Object msg) { * {@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 void error(final Object parameterizedMsg, final Object param1) { 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)); }
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; /**
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ülcü + @since version 0.8.5 + + */ +public interface LoggerFactory { + + Logger makeNewLoggerInstance(String name); + +}
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ülcü + @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(); + +}
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 @@ void removeLoggerRepositoryEventListener( @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 @@ void removeLoggerRepositoryEventListener( void fireConfigurationChangedEvent(); /** - * Return the PluginRegisty for this LoggerRepository. + * Return the PluginRegistry for this LoggerRepository. * @return plug in registry. */ PluginRegistry getPluginRegistry();
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ülcü + @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); +}
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); + +}
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 @@ */ 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.
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 @@ * @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 ListModel getModel() { 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 void clearModel() { model.clear(); } - /** {@inheritDoc} */ - public boolean requiresLayout() { - return false; - } - }
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()); + } +}
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.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 UtilLoggingXMLDecoder() { /** * 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 @@ private Document parse(final String data) { * @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 Vector decode(final URL url) throws IOException { } 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 Vector decode(final URL url) throws IOException { * @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 Vector decodeEvents(final String document) { /** * 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 LoggingEvent decode(final String data) { * @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 @@ private Vector decodeEvents(final Document document) { 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 @@ private Vector decodeEvents(final Document document) { } 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 @@ private Vector decodeEvents(final Document document) { } } 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 @@ private Vector decodeEvents(final Document document) { throwableInfo = new ThrowableInformation(exception); } - LoggingEvent loggingEvent = new LoggingEvent(null, + LogEvent loggingEvent = new LogEvent(null, logger, timeStamp, level, message, threadName, throwableInfo, @@ -450,7 +446,7 @@ private Vector decodeEvents(final Document document) { * @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++) {
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.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 @@ /** - * 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 XMLDecoder() { 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 XMLDecoder() { /** * 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 @@ private Document parse(final String data) { // 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 @@ private Document parse(final String data) { * @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 Vector decode(final URL url) throws IOException { 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 Vector decode(final URL url) throws IOException { * @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 Vector decodeEvents(final String document) { /** * 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 LoggingEvent decode(final String data) { Vector events = decodeEvents(document); if (events.size() > 0) { - return (LoggingEvent) events.firstElement(); + return (LogEvent) events.firstElement(); } return null; @@ -307,8 +307,8 @@ public LoggingEvent decode(final String data) { * @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 @@ private Vector decodeEvents(final Document document) { 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 @@ private Vector decodeEvents(final Document document) { } } - 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,
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")); - } -}
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
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>
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
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>
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
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>