http://git-wip-us.apache.org/repos/asf/logging-chainsaw/blob/96ebd9ad/src/main/java/org/apache/log4j/chainsaw/Generator.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/log4j/chainsaw/Generator.java b/src/main/java/org/apache/log4j/chainsaw/Generator.java index e735e95..7ad7baa 100644 --- a/src/main/java/org/apache/log4j/chainsaw/Generator.java +++ b/src/main/java/org/apache/log4j/chainsaw/Generator.java @@ -5,9 +5,9 @@ * 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. @@ -17,9 +17,6 @@ package org.apache.log4j.chainsaw; -import java.util.HashMap; -import java.util.Map; - import org.apache.log4j.Level; import org.apache.log4j.Logger; import org.apache.log4j.MDC; @@ -30,103 +27,105 @@ import org.apache.log4j.spi.LocationInfo; import org.apache.log4j.spi.LoggingEvent; import org.apache.log4j.spi.ThrowableInformation; +import java.util.HashMap; +import java.util.Map; + /** * Class designed to stress, and/or test the Chainsaw GUI by sending it * lots of Logging Events. * * @author Scott Deboy <sde...@apache.org> - * */ public class Generator extends Receiver implements Runnable { - private static final Logger logger1 = - Logger.getLogger("com.mycompany.mycomponentA"); - private static final Logger logger2 = - Logger.getLogger("com.mycompany.mycomponentB"); - private static final Logger logger3 = - Logger.getLogger("com.someothercompany.corecomponent"); - private final String baseString_; - private Thread thread; - private boolean shutdown; + private static final Logger logger1 = + Logger.getLogger("com.mycompany.mycomponentA"); + private static final Logger logger2 = + Logger.getLogger("com.mycompany.mycomponentB"); + private static final Logger logger3 = + Logger.getLogger("com.someothercompany.corecomponent"); + private final String baseString_; + private Thread thread; + private boolean shutdown; - public Generator(String name) { - setName(name); - baseString_ = name; - } + public Generator(String name) { + setName(name); + baseString_ = name; + } - private LoggingEvent createEvent( - Level level, Logger logger, String msg, Throwable t) { - ThrowableInformation ti = new ThrowableInformation(t); - Map<String, String> properties = new HashMap<>(); - properties.put(Constants.APPLICATION_KEY, getName()); - properties.put(Constants.HOSTNAME_KEY, "localhost"); - LocationInfo li = new LocationInfo("file", logger.getClass().getName(), "method", "123"); - LoggingEvent e = new LoggingEvent( - logger.getClass().getName(), logger, System.currentTimeMillis(), level, msg, "Thread=1", ti, "NDC value", li, properties); - return e; - } + private LoggingEvent createEvent( + Level level, Logger logger, String msg, Throwable t) { + ThrowableInformation ti = new ThrowableInformation(t); + Map<String, String> properties = new HashMap<>(); + properties.put(Constants.APPLICATION_KEY, getName()); + properties.put(Constants.HOSTNAME_KEY, "localhost"); + LocationInfo li = new LocationInfo("file", logger.getClass().getName(), "method", "123"); + LoggingEvent e = new LoggingEvent( + logger.getClass().getName(), logger, System.currentTimeMillis(), level, msg, "Thread=1", ti, "NDC value", li, properties); + return e; + } - public void run() { - NDC.push(baseString_); - MDC.put("some string", "some value" + baseString_); + public void run() { + NDC.push(baseString_); + MDC.put("some string", "some value" + baseString_); - int i = 0; + int i = 0; - while (!shutdown) { - doPost(createEvent(Level.TRACE, logger1, "tracemsg" + i++, null)); - doPost( - createEvent( - Level.DEBUG, logger1, - "debugmsg " + i++ - + " g dg sdfa sadf sdf safd fsda asfd sdfa sdaf asfd asdf fasd fasd adfs fasd adfs fads afds afds afsd afsd afsd afsd afsd fasd asfd asfd afsd fasd afsd", - null)); - doPost(createEvent(Level.INFO, logger1, "infomsg " + i++, null)); - doPost(createEvent(Level.WARN, logger1, "warnmsg " + i++, null)); - doPost(createEvent(Level.ERROR, logger1, "errormsg " + i++, null)); - doPost(createEvent(Level.FATAL, logger1, "fatalmsg " + i++, new Exception("someexception-" + baseString_))); - doPost(createEvent(Level.TRACE, logger2, "tracemsg" + i++, null)); - doPost( - createEvent( - Level.DEBUG, logger2, - "debugmsg " + i++ - + " g dg sdfa sadf sdf safd fsda asfd sdfa sdaf asfd asdf fasd fasd adfs fasd adfs fads afds afds afsd afsd afsd afsd afsd fasd asfd asfd afsd fasd afsd", - null)); - doPost(createEvent(Level.INFO, logger2, "infomsg " + i++, null)); - doPost(createEvent(Level.WARN, logger2, "warnmsg " + i++, null)); - doPost(createEvent(Level.ERROR, logger2, "errormsg " + i++, null)); - doPost(createEvent(Level.FATAL, logger2, "fatalmsg " + i++, new Exception("someexception-" + baseString_))); - doPost(createEvent(Level.TRACE, logger3, "tracemsg" + i++, null)); - doPost( - createEvent( - Level.DEBUG, logger3, - "debugmsg " + i++ - + " g dg sdfa sadf sdf safd fsda asfd sdfa sdaf asfd asdf fasd fasd adfs fasd adfs fads afds afds afsd afsd afsd afsd afsd fasd asfd asfd afsd fasd afsd", - null)); - doPost(createEvent(Level.INFO, logger3, "infomsg " + i++, null)); - doPost(createEvent(Level.WARN, logger3, "warnmsg " + i++, null)); - doPost(createEvent(Level.ERROR, logger3, "errormsg " + i++, null)); - doPost(createEvent(Level.FATAL, logger3, "fatalmsg " + i++, new Exception("someexception-" + baseString_))); + while (!shutdown) { + doPost(createEvent(Level.TRACE, logger1, "tracemsg" + i++, null)); + doPost( + createEvent( + Level.DEBUG, logger1, + "debugmsg " + i++ + + " g dg sdfa sadf sdf safd fsda asfd sdfa sdaf asfd asdf fasd fasd adfs fasd adfs fads afds afds afsd afsd afsd afsd afsd fasd asfd asfd afsd fasd afsd", + null)); + doPost(createEvent(Level.INFO, logger1, "infomsg " + i++, null)); + doPost(createEvent(Level.WARN, logger1, "warnmsg " + i++, null)); + doPost(createEvent(Level.ERROR, logger1, "errormsg " + i++, null)); + doPost(createEvent(Level.FATAL, logger1, "fatalmsg " + i++, new Exception("someexception-" + baseString_))); + doPost(createEvent(Level.TRACE, logger2, "tracemsg" + i++, null)); + doPost( + createEvent( + Level.DEBUG, logger2, + "debugmsg " + i++ + + " g dg sdfa sadf sdf safd fsda asfd sdfa sdaf asfd asdf fasd fasd adfs fasd adfs fads afds afds afsd afsd afsd afsd afsd fasd asfd asfd afsd fasd afsd", + null)); + doPost(createEvent(Level.INFO, logger2, "infomsg " + i++, null)); + doPost(createEvent(Level.WARN, logger2, "warnmsg " + i++, null)); + doPost(createEvent(Level.ERROR, logger2, "errormsg " + i++, null)); + doPost(createEvent(Level.FATAL, logger2, "fatalmsg " + i++, new Exception("someexception-" + baseString_))); + doPost(createEvent(Level.TRACE, logger3, "tracemsg" + i++, null)); + doPost( + createEvent( + Level.DEBUG, logger3, + "debugmsg " + i++ + + " g dg sdfa sadf sdf safd fsda asfd sdfa sdaf asfd asdf fasd fasd adfs fasd adfs fads afds afds afsd afsd afsd afsd afsd fasd asfd asfd afsd fasd afsd", + null)); + doPost(createEvent(Level.INFO, logger3, "infomsg " + i++, null)); + doPost(createEvent(Level.WARN, logger3, "warnmsg " + i++, null)); + doPost(createEvent(Level.ERROR, logger3, "errormsg " + i++, null)); + doPost(createEvent(Level.FATAL, logger3, "fatalmsg " + i++, new Exception("someexception-" + baseString_))); - try { - Thread.sleep(1000); - } catch (InterruptedException ie) { - } + try { + Thread.sleep(1000); + } catch (InterruptedException ie) { + } + } } - } - /* (non-Javadoc) - * @see org.apache.log4j.plugins.Plugin#shutdown() - */ - public void shutdown() { - shutdown = true; - } + /* (non-Javadoc) + * @see org.apache.log4j.plugins.Plugin#shutdown() + */ + public void shutdown() { + shutdown = true; + } - /* (non-Javadoc) - * @see org.apache.log4j.spi.OptionHandler#activateOptions() - */ - public void activateOptions() { - thread = new Thread(this); - thread.setPriority(Thread.MIN_PRIORITY); - thread.start(); - } + /* (non-Javadoc) + * @see org.apache.log4j.spi.OptionHandler#activateOptions() + */ + public void activateOptions() { + thread = new Thread(this); + thread.setPriority(Thread.MIN_PRIORITY); + thread.start(); + } }
http://git-wip-us.apache.org/repos/asf/logging-chainsaw/blob/96ebd9ad/src/main/java/org/apache/log4j/chainsaw/GeneratorBeanInfo.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/log4j/chainsaw/GeneratorBeanInfo.java b/src/main/java/org/apache/log4j/chainsaw/GeneratorBeanInfo.java index 0c3d788..fd9fd16 100644 --- a/src/main/java/org/apache/log4j/chainsaw/GeneratorBeanInfo.java +++ b/src/main/java/org/apache/log4j/chainsaw/GeneratorBeanInfo.java @@ -5,9 +5,9 @@ * 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. @@ -25,20 +25,19 @@ import java.beans.SimpleBeanInfo; * Generator plugin * * @author Paul Smith <psm...@apache.org> - * */ public class GeneratorBeanInfo extends SimpleBeanInfo { - /* (non-Javadoc) - * @see java.beans.BeanInfo#getPropertyDescriptors() - */ - public PropertyDescriptor[] getPropertyDescriptors() { - try { - return new PropertyDescriptor[] { - new PropertyDescriptor("name", Generator.class), - }; - } catch (Exception e) { - } + /* (non-Javadoc) + * @see java.beans.BeanInfo#getPropertyDescriptors() + */ + public PropertyDescriptor[] getPropertyDescriptors() { + try { + return new PropertyDescriptor[]{ + new PropertyDescriptor("name", Generator.class), + }; + } catch (Exception e) { + } - return null; - } + return null; + } } http://git-wip-us.apache.org/repos/asf/logging-chainsaw/blob/96ebd9ad/src/main/java/org/apache/log4j/chainsaw/JSortTable.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/log4j/chainsaw/JSortTable.java b/src/main/java/org/apache/log4j/chainsaw/JSortTable.java index 601fc3b..64ae803 100644 --- a/src/main/java/org/apache/log4j/chainsaw/JSortTable.java +++ b/src/main/java/org/apache/log4j/chainsaw/JSortTable.java @@ -5,9 +5,9 @@ * 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. @@ -17,15 +17,14 @@ package org.apache.log4j.chainsaw; -import java.awt.event.InputEvent; -import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; +import org.apache.log4j.chainsaw.helper.SwingHelper; -import javax.swing.JTable; +import javax.swing.*; import javax.swing.table.JTableHeader; import javax.swing.table.TableColumnModel; - -import org.apache.log4j.chainsaw.helper.SwingHelper; +import java.awt.event.InputEvent; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; /** @@ -34,129 +33,128 @@ import org.apache.log4j.chainsaw.helper.SwingHelper; * * @author Claude Duguay * @author Scott Deboy <sde...@apache.org> - * */ public class JSortTable extends JTable implements MouseListener { - protected int sortedColumnIndex = -1; - protected boolean sortedColumnAscending = true; - private String sortedColumn; - private int lastSelectedColumn = -1; - - public JSortTable(SortTableModel model) { - super(model); - initSortHeader(); - } - - public void changeSelection(int rowIndex, int columnIndex, boolean toggle, boolean extend) { - //selection of the msg field causes rendering to flash...skip over it - int colToSelect = columnIndex; - //CHAINSAW columns are 1-based indexes - if (columnIndex + 1 == ChainsawColumns.INDEX_MESSAGE_COL_NAME) { - colToSelect = lastSelectedColumn < columnIndex ? columnIndex + 1 : columnIndex - 1; - super.changeSelection(rowIndex, colToSelect, toggle, extend); - } else { - super.changeSelection(rowIndex, columnIndex, toggle, extend); + protected int sortedColumnIndex = -1; + protected boolean sortedColumnAscending = true; + private String sortedColumn; + private int lastSelectedColumn = -1; + + public JSortTable(SortTableModel model) { + super(model); + initSortHeader(); } - lastSelectedColumn = colToSelect; - } - - protected void initSortHeader() { - JTableHeader header = getTableHeader(); - header.setDefaultRenderer(new SortHeaderRenderer()); - header.addMouseListener(this); - } - - public int getSortedColumnIndex() { - return sortedColumnIndex; - } - - public void updateSortedColumn() { - if (sortedColumn != null) { - try { - sortedColumnIndex = columnModel.getColumnIndex(sortedColumn); - getTableHeader().resizeAndRepaint(); - } catch (IllegalArgumentException ie) {//nothing...column is not in the model - setSortedColumnIndex(-1); - } - } - } - - public void setSortedColumnIndex(int index) { - sortedColumnIndex = index; - if (sortedColumnIndex > -1) { - SortTableModel model = (SortTableModel) getModel(); - model.sortColumn(sortedColumnIndex, sortedColumnAscending); + + public void changeSelection(int rowIndex, int columnIndex, boolean toggle, boolean extend) { + //selection of the msg field causes rendering to flash...skip over it + int colToSelect = columnIndex; + //CHAINSAW columns are 1-based indexes + if (columnIndex + 1 == ChainsawColumns.INDEX_MESSAGE_COL_NAME) { + colToSelect = lastSelectedColumn < columnIndex ? columnIndex + 1 : columnIndex - 1; + super.changeSelection(rowIndex, colToSelect, toggle, extend); + } else { + super.changeSelection(rowIndex, columnIndex, toggle, extend); + } + lastSelectedColumn = colToSelect; + } + + protected void initSortHeader() { + JTableHeader header = getTableHeader(); + header.setDefaultRenderer(new SortHeaderRenderer()); + header.addMouseListener(this); } - getTableHeader().resizeAndRepaint(); - } - - //Allow synchronous updates if already on the EDT - private void scrollTo(final int row, final int col) { - SwingHelper.invokeOnEDT(() -> { - final int currentRow = getSelectedRow(); - if ((row > -1) && (row < getRowCount())) { - try { - //get the requested row off of the bottom and top of the screen by making the 5 rows around the requested row visible - //if new past current row, scroll to display the 20th row past new selected row - scrollRectToVisible(getCellRect(row, col, true)); - if (row > currentRow) { - scrollRectToVisible(getCellRect(row + 5, col, true)); - } - if (row < currentRow) { - scrollRectToVisible(getCellRect(row - 5, col, true)); - } - scrollRectToVisible(getCellRect(row, col, true)); - setRowSelectionInterval(row, row); - } catch (IllegalArgumentException iae) { - //ignore..out of bounds + + public int getSortedColumnIndex() { + return sortedColumnIndex; + } + + public void updateSortedColumn() { + if (sortedColumn != null) { + try { + sortedColumnIndex = columnModel.getColumnIndex(sortedColumn); + getTableHeader().resizeAndRepaint(); + } catch (IllegalArgumentException ie) {//nothing...column is not in the model + setSortedColumnIndex(-1); + } } - } - }); - } - - public void scrollToRow(int row) { - scrollTo(row, columnAtPoint(getVisibleRect().getLocation())); - } - - public boolean isSortedColumnAscending() { - return sortedColumnAscending; - } - - public void mouseClicked(MouseEvent event) { - - if(event.getClickCount()<2 || event.isPopupTrigger()){ - return; - }else if(event.getClickCount()>1 && ((event.getModifiers() & InputEvent.BUTTON2_MASK)>0)){ - return; - } - - TableColumnModel colModel = getColumnModel(); - int index = colModel.getColumnIndexAtX(event.getX()); - int modelIndex = colModel.getColumn(index).getModelIndex(); - SortTableModel model = (SortTableModel) getModel(); - - if (model.isSortable(modelIndex)) { - // toggle ascension, if already sorted - if (sortedColumnIndex == index) { - sortedColumnAscending = !sortedColumnAscending; - } - - sortedColumnIndex = index; - sortedColumn = colModel.getColumn(index).getHeaderValue().toString(); - model.sortColumn(modelIndex, sortedColumnAscending); - getTableHeader().resizeAndRepaint(); } - } - public void mousePressed(MouseEvent event) { - } + public void setSortedColumnIndex(int index) { + sortedColumnIndex = index; + if (sortedColumnIndex > -1) { + SortTableModel model = (SortTableModel) getModel(); + model.sortColumn(sortedColumnIndex, sortedColumnAscending); + } + getTableHeader().resizeAndRepaint(); + } - public void mouseReleased(MouseEvent event) { - } + //Allow synchronous updates if already on the EDT + private void scrollTo(final int row, final int col) { + SwingHelper.invokeOnEDT(() -> { + final int currentRow = getSelectedRow(); + if ((row > -1) && (row < getRowCount())) { + try { + //get the requested row off of the bottom and top of the screen by making the 5 rows around the requested row visible + //if new past current row, scroll to display the 20th row past new selected row + scrollRectToVisible(getCellRect(row, col, true)); + if (row > currentRow) { + scrollRectToVisible(getCellRect(row + 5, col, true)); + } + if (row < currentRow) { + scrollRectToVisible(getCellRect(row - 5, col, true)); + } + scrollRectToVisible(getCellRect(row, col, true)); + setRowSelectionInterval(row, row); + } catch (IllegalArgumentException iae) { + //ignore..out of bounds + } + } + }); + } + + public void scrollToRow(int row) { + scrollTo(row, columnAtPoint(getVisibleRect().getLocation())); + } - public void mouseEntered(MouseEvent event) { - } + public boolean isSortedColumnAscending() { + return sortedColumnAscending; + } + + public void mouseClicked(MouseEvent event) { - public void mouseExited(MouseEvent event) { - } + if (event.getClickCount() < 2 || event.isPopupTrigger()) { + return; + } else if (event.getClickCount() > 1 && ((event.getModifiers() & InputEvent.BUTTON2_MASK) > 0)) { + return; + } + + TableColumnModel colModel = getColumnModel(); + int index = colModel.getColumnIndexAtX(event.getX()); + int modelIndex = colModel.getColumn(index).getModelIndex(); + SortTableModel model = (SortTableModel) getModel(); + + if (model.isSortable(modelIndex)) { + // toggle ascension, if already sorted + if (sortedColumnIndex == index) { + sortedColumnAscending = !sortedColumnAscending; + } + + sortedColumnIndex = index; + sortedColumn = colModel.getColumn(index).getHeaderValue().toString(); + model.sortColumn(modelIndex, sortedColumnAscending); + getTableHeader().resizeAndRepaint(); + } + } + + public void mousePressed(MouseEvent event) { + } + + public void mouseReleased(MouseEvent event) { + } + + public void mouseEntered(MouseEvent event) { + } + + public void mouseExited(MouseEvent event) { + } } http://git-wip-us.apache.org/repos/asf/logging-chainsaw/blob/96ebd9ad/src/main/java/org/apache/log4j/chainsaw/JTextComponentFormatter.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/log4j/chainsaw/JTextComponentFormatter.java b/src/main/java/org/apache/log4j/chainsaw/JTextComponentFormatter.java index 89ad68a..543c69b 100644 --- a/src/main/java/org/apache/log4j/chainsaw/JTextComponentFormatter.java +++ b/src/main/java/org/apache/log4j/chainsaw/JTextComponentFormatter.java @@ -16,24 +16,22 @@ */ package org.apache.log4j.chainsaw; -import java.awt.Font; - -import javax.swing.UIManager; +import javax.swing.*; import javax.swing.text.Document; import javax.swing.text.JTextComponent; import javax.swing.text.html.HTMLDocument; +import java.awt.*; /** * Apply system font and size (normal size + 1) rule if the JEditorPane document contains html. */ -public class JTextComponentFormatter -{ +public class JTextComponentFormatter { public static void applySystemFontAndSize(JTextComponent textComponent) { Document document = textComponent.getDocument(); if (document instanceof HTMLDocument) { - Font font = UIManager.getFont("Label.font"); - String bodyRule = "body { font-family: " + font.getFamily() + "; font-size: " + (font.getSize() + 1) + "pt; }"; - ((HTMLDocument)document).getStyleSheet().addRule(bodyRule); + Font font = UIManager.getFont("Label.font"); + String bodyRule = "body { font-family: " + font.getFamily() + "; font-size: " + (font.getSize() + 1) + "pt; }"; + ((HTMLDocument) document).getStyleSheet().addRule(bodyRule); } } } http://git-wip-us.apache.org/repos/asf/logging-chainsaw/blob/96ebd9ad/src/main/java/org/apache/log4j/chainsaw/LogFilePatternLayoutBuilder.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/log4j/chainsaw/LogFilePatternLayoutBuilder.java b/src/main/java/org/apache/log4j/chainsaw/LogFilePatternLayoutBuilder.java index 032c267..16c4fc5 100644 --- a/src/main/java/org/apache/log4j/chainsaw/LogFilePatternLayoutBuilder.java +++ b/src/main/java/org/apache/log4j/chainsaw/LogFilePatternLayoutBuilder.java @@ -16,42 +16,9 @@ */ package org.apache.log4j.chainsaw; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.Enumeration; -import java.util.HashMap; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.Properties; - -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; - import org.apache.log4j.chainsaw.messages.MessageCenter; import org.apache.log4j.helpers.OptionConverter; -import org.apache.log4j.pattern.ClassNamePatternConverter; -import org.apache.log4j.pattern.DatePatternConverter; -import org.apache.log4j.pattern.FileLocationPatternConverter; -import org.apache.log4j.pattern.FullLocationPatternConverter; -import org.apache.log4j.pattern.LevelPatternConverter; -import org.apache.log4j.pattern.LineLocationPatternConverter; -import org.apache.log4j.pattern.LineSeparatorPatternConverter; -import org.apache.log4j.pattern.LiteralPatternConverter; -import org.apache.log4j.pattern.LoggerPatternConverter; -import org.apache.log4j.pattern.LoggingEventPatternConverter; -import org.apache.log4j.pattern.MessagePatternConverter; -import org.apache.log4j.pattern.MethodLocationPatternConverter; -import org.apache.log4j.pattern.NDCPatternConverter; -import org.apache.log4j.pattern.PatternParser; -import org.apache.log4j.pattern.PropertiesPatternConverter; -import org.apache.log4j.pattern.RelativeTimePatternConverter; -import org.apache.log4j.pattern.SequenceNumberPatternConverter; -import org.apache.log4j.pattern.ThreadPatternConverter; +import org.apache.log4j.pattern.*; import org.apache.log4j.xml.Log4jEntityResolver; import org.apache.log4j.xml.SAXErrorHandler; import org.w3c.dom.Document; @@ -61,8 +28,16 @@ import org.w3c.dom.NodeList; import org.xml.sax.InputSource; import org.xml.sax.SAXException; -public class LogFilePatternLayoutBuilder -{ +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.*; + +public class LogFilePatternLayoutBuilder { public static String getLogFormatFromPatternLayout(String patternLayout) { String input = OptionConverter.convertSpecialChars(patternLayout); List converters = new ArrayList(); @@ -74,31 +49,31 @@ public class LogFilePatternLayoutBuilder } public static String getTimeStampFormat(String patternLayout) { - int basicIndex = patternLayout.indexOf("%d"); - if (basicIndex < 0) { - return null; - } + int basicIndex = patternLayout.indexOf("%d"); + if (basicIndex < 0) { + return null; + } - int index = patternLayout.indexOf("%d{"); - //%d - default - if (index < 0) { - return "yyyy-MM-dd HH:mm:ss,SSS"; - } + int index = patternLayout.indexOf("%d{"); + //%d - default + if (index < 0) { + return "yyyy-MM-dd HH:mm:ss,SSS"; + } - int length = patternLayout.substring(index).indexOf("}"); - String timestampFormat = patternLayout.substring(index + "%d{".length(), index + length); - if (timestampFormat.equals("ABSOLUTE")) { - return "HH:mm:ss,SSS"; - } - if (timestampFormat.equals("ISO8601")) { - return "yyyy-MM-dd HH:mm:ss,SSS"; - } - if (timestampFormat.equals("DATE")) { - return "dd MMM yyyy HH:mm:ss,SSS"; - } - return timestampFormat; + int length = patternLayout.substring(index).indexOf("}"); + String timestampFormat = patternLayout.substring(index + "%d{".length(), index + length); + if (timestampFormat.equals("ABSOLUTE")) { + return "HH:mm:ss,SSS"; + } + if (timestampFormat.equals("ISO8601")) { + return "yyyy-MM-dd HH:mm:ss,SSS"; + } + if (timestampFormat.equals("DATE")) { + return "dd MMM yyyy HH:mm:ss,SSS"; + } + return timestampFormat; } - + private static String getFormatFromConverters(List converters) { StringBuffer buffer = new StringBuffer(); for (Object converter1 : converters) { @@ -148,59 +123,59 @@ public class LogFilePatternLayoutBuilder return buffer.toString(); } - public static Map<String, Map<String, String>> getAppenderConfiguration(File file) { - try { - return getXMLFileAppenderConfiguration(file); - } catch (IOException | SAXException | ParserConfigurationException e) { - //ignore - } - try { - return getPropertiesFileAppenderConfiguration(file); - } catch (Exception e) { - //ignore + public static Map<String, Map<String, String>> getAppenderConfiguration(File file) { + try { + return getXMLFileAppenderConfiguration(file); + } catch (IOException | SAXException | ParserConfigurationException e) { + //ignore + } + try { + return getPropertiesFileAppenderConfiguration(file); + } catch (Exception e) { + //ignore + } + //don't return null + return new HashMap<>(); } - //don't return null - return new HashMap<>(); - } - public static Map<String, Map<String, String>> getPropertiesFileAppenderConfiguration(File propertyFile) throws IOException { - Map<String, Map<String, String>> result = new HashMap<>(); - String appenderPrefix = "log4j.appender"; - Properties props = new Properties(); - FileInputStream inputStream = null; - try { - inputStream = new FileInputStream(propertyFile); - props.load(inputStream); - Enumeration propertyNames = props.propertyNames(); - Map<String, String> appenders = new HashMap<>(); - while (propertyNames.hasMoreElements()) { - String propertyName = propertyNames.nextElement().toString(); - if (propertyName.startsWith(appenderPrefix)) { - String value = propertyName.substring(appenderPrefix.length() + 1); - if (!value.contains(".")) { - //no sub-values - this entry is the appender name & class - appenders.put(value, props.getProperty(propertyName).trim()); - } - } - } - for (Object o : appenders.entrySet()) { - Map.Entry appenderEntry = (Map.Entry) o; - 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<String, String> entry = new HashMap<>(); - entry.put("file", file.trim()); - entry.put("conversion", conversion.trim()); - result.put(appenderName, entry); + public static Map<String, Map<String, String>> getPropertiesFileAppenderConfiguration(File propertyFile) throws IOException { + Map<String, Map<String, String>> result = new HashMap<>(); + String appenderPrefix = "log4j.appender"; + Properties props = new Properties(); + FileInputStream inputStream = null; + try { + inputStream = new FileInputStream(propertyFile); + props.load(inputStream); + Enumeration propertyNames = props.propertyNames(); + Map<String, String> appenders = new HashMap<>(); + while (propertyNames.hasMoreElements()) { + String propertyName = propertyNames.nextElement().toString(); + if (propertyName.startsWith(appenderPrefix)) { + String value = propertyName.substring(appenderPrefix.length() + 1); + if (!value.contains(".")) { + //no sub-values - this entry is the appender name & class + appenders.put(value, props.getProperty(propertyName).trim()); + } + } + } + for (Object o : appenders.entrySet()) { + Map.Entry appenderEntry = (Map.Entry) o; + 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<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 @@ -210,80 +185,78 @@ public class LogFilePatternLayoutBuilder log4j.appender.R.layout=org.apache.log4j.PatternLayout log4j.appender.R.layout.ConversionPattern=%d - %p %t %c - %m%n */ + } catch (IOException ioe) { + } finally { + if (inputStream != null) { + inputStream.close(); + } + } + //don't return null + return result; } - catch (IOException ioe) { - } - finally { - if (inputStream != null) { - inputStream.close(); - } - } - //don't return null - return result; - } - private static Map<String, Map<String, String>> getXMLFileAppenderConfiguration(File file) throws IOException, ParserConfigurationException, SAXException { - 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(); + private static Map<String, Map<String, String>> getXMLFileAppenderConfiguration(File file) throws IOException, ParserConfigurationException, SAXException { + 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()); + 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(); // 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<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); - } - } - } - } - MessageCenter.getInstance().getLogger().info("getXMLFileAppenderConfiguration for file: " + file + ", result: " + result); - return result; - } + 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); + } + } + } + } + MessageCenter.getInstance().getLogger().info("getXMLFileAppenderConfiguration for file: " + file + ", result: " + result); + return result; + } }