You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jmeter.apache.org by pm...@apache.org on 2017/02/05 13:42:22 UTC
svn commit: r1781756 - in /jmeter/trunk/src/core/org/apache/jmeter: ./ gui/
gui/action/ gui/logging/ samplers/ util/
Author: pmouawad
Date: Sun Feb 5 13:42:22 2017
New Revision: 1781756
URL: http://svn.apache.org/viewvc?rev=1781756&view=rev
Log:
Bug 60589 - Migrate LogKit to SLF4J - Drop avalon, logkit and excalibur with backward compatibility for 3rd party modules
Part 1 of PR #254
Contributed by Woonsan Ko
Bugzilla Id: 60589
Added:
jmeter/trunk/src/core/org/apache/jmeter/gui/logging/
jmeter/trunk/src/core/org/apache/jmeter/gui/logging/GuiLogEventAppender.java (with props)
jmeter/trunk/src/core/org/apache/jmeter/gui/logging/GuiLogEventBus.java (with props)
jmeter/trunk/src/core/org/apache/jmeter/gui/logging/GuiLogEventListener.java (with props)
jmeter/trunk/src/core/org/apache/jmeter/gui/logging/LogEventObject.java (with props)
Modified:
jmeter/trunk/src/core/org/apache/jmeter/JMeter.java
jmeter/trunk/src/core/org/apache/jmeter/NewDriver.java
jmeter/trunk/src/core/org/apache/jmeter/gui/GuiPackage.java
jmeter/trunk/src/core/org/apache/jmeter/gui/LoggerPanel.java
jmeter/trunk/src/core/org/apache/jmeter/gui/MainFrame.java
jmeter/trunk/src/core/org/apache/jmeter/gui/action/What.java
jmeter/trunk/src/core/org/apache/jmeter/samplers/SampleResult.java
jmeter/trunk/src/core/org/apache/jmeter/util/JMeterUtils.java
Modified: jmeter/trunk/src/core/org/apache/jmeter/JMeter.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/JMeter.java?rev=1781756&r1=1781755&r2=1781756&view=diff
==============================================================================
--- jmeter/trunk/src/core/org/apache/jmeter/JMeter.java (original)
+++ jmeter/trunk/src/core/org/apache/jmeter/JMeter.java Sun Feb 5 13:42:22 2017
@@ -96,6 +96,8 @@ import org.apache.jorphan.util.HeapDumpe
import org.apache.jorphan.util.JMeterException;
import org.apache.jorphan.util.JOrphanUtils;
import org.apache.log.Logger;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.core.config.Configurator;
import com.thoughtworks.xstream.converters.ConversionException;
@@ -132,6 +134,8 @@ public class JMeter implements JMeterPlu
private static final int JMETER_HOME_OPT = 'd';// $NON-NLS-1$
private static final int HELP_OPT = 'h';// $NON-NLS-1$
private static final int OPTIONS_OPT = '?';// $NON-NLS-1$
+ // logging configuration file
+ private static final int JMLOGCONF_OPT = 'i';// $NON-NLS-1$
// jmeter.log
private static final int JMLOGFILE_OPT = 'j';// $NON-NLS-1$
// sample result log file
@@ -161,6 +165,7 @@ public class JMeter implements JMeterPlu
private static final String JMX_SUFFIX = ".JMX"; // $NON-NLS-1$
+ private static final String PACKAGE_PREFIX = "org.apache."; //$NON_NLS-1$
/**
* Define the understood options. Each CLOptionDescriptor contains:
@@ -195,6 +200,9 @@ public class JMeter implements JMeterPlu
private static final CLOptionDescriptor D_LOGFILE_OPT =
new CLOptionDescriptor("logfile", CLOptionDescriptor.ARGUMENT_REQUIRED, LOGFILE_OPT,
"the file to log samples to");
+ private static final CLOptionDescriptor D_JMLOGCONF_OPT =
+ new CLOptionDescriptor("jmeterlogconf", CLOptionDescriptor.ARGUMENT_REQUIRED, JMLOGCONF_OPT,
+ "jmeter logging configuration file (log4j2.xml)");
private static final CLOptionDescriptor D_JMLOGFILE_OPT =
new CLOptionDescriptor("jmeterlogfile", CLOptionDescriptor.ARGUMENT_REQUIRED, JMLOGFILE_OPT,
"jmeter run log file (jmeter.log)");
@@ -287,6 +295,7 @@ public class JMeter implements JMeterPlu
D_PROPFILE2_OPT,
D_TESTFILE_OPT,
D_LOGFILE_OPT,
+ D_JMLOGCONF_OPT,
D_JMLOGFILE_OPT,
D_NONGUI_OPT,
D_SERVER_OPT,
@@ -413,16 +422,6 @@ public class JMeter implements JMeterPlu
}
try {
initializeProperties(parser); // Also initialises JMeter logging
- /*
- * The following is needed for HTTPClient.
- * (originally tried doing this in HTTPSampler2,
- * but it appears that it was done too late when running in GUI mode)
- * Set the commons logging default to Avalon Logkit, if not already defined
- */
- if (System.getProperty("org.apache.commons.logging.Log") == null) { // $NON-NLS-1$
- System.setProperty("org.apache.commons.logging.Log" // $NON-NLS-1$
- , "org.apache.commons.logging.impl.LogKitLogger"); // $NON-NLS-1$
- }
Thread.setDefaultUncaughtExceptionHandler(
(Thread t, Throwable e) -> {
@@ -695,13 +694,6 @@ public class JMeter implements JMeterPlu
+ "jmeter.properties");// $NON-NLS-1$
}
- if (parser.getArgumentById(JMLOGFILE_OPT) != null){
- String jmlogfile=parser.getArgumentById(JMLOGFILE_OPT).getArgument();
- jmlogfile = processLAST(jmlogfile, ".log");// $NON-NLS-1$
- JMeterUtils.setProperty(LoggingManager.LOG_FILE,jmlogfile);
- }
-
- JMeterUtils.initLogging();
JMeterUtils.initLocale();
// Bug 33845 - allow direct override of Home dir
if (parser.getArgumentById(JMETER_HOME_OPT) == null) {
@@ -723,7 +715,6 @@ public class JMeter implements JMeterPlu
Properties tmp = new Properties();
tmp.load(fis);
jmeterProps.putAll(tmp);
- LoggingManager.setLoggingLevels(tmp);//Do what would be done earlier
} catch (IOException e) {
log.warn("Error loading user property file: " + userProp, e);
}
@@ -763,7 +754,6 @@ public class JMeter implements JMeterPlu
Properties tmp = new Properties();
tmp.load(fis);
jmeterProps.putAll(tmp);
- LoggingManager.setLoggingLevels(tmp);//Do what would be done earlier
} catch (FileNotFoundException e) { // NOSONAR
log.warn("Can't find additional property file: " + name, e);
} catch (IOException e) { // NOSONAR
@@ -817,10 +807,24 @@ public class JMeter implements JMeterPlu
case LOGLEVEL:
if (value.length() > 0) { // Set category
log.info("LogLevel: " + name + "=" + value);
- LoggingManager.setPriority(value, name);
+ final Level logLevel = Level.getLevel(value);
+ if (logLevel != null) {
+ String loggerName = name;
+ if (name.startsWith("jmeter") || name.startsWith("jorphan")) {
+ loggerName = PACKAGE_PREFIX + name;
+ }
+ Configurator.setAllLevels(loggerName, logLevel);
+ } else {
+ log.warn("Invalid log level, '" + value + "' for '" + name + "'.");
+ }
} else { // Set root level
log.warn("LogLevel: " + name);
- LoggingManager.setPriority(name);
+ final Level logLevel = Level.getLevel(name);
+ if (logLevel != null) {
+ Configurator.setRootLevel(logLevel);
+ } else {
+ log.warn("Invalid log level, '" + name + "' for the root logger.");
+ }
}
break;
case REMOTE_STOP:
Modified: jmeter/trunk/src/core/org/apache/jmeter/NewDriver.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/NewDriver.java?rev=1781756&r1=1781755&r2=1781756&view=diff
==============================================================================
--- jmeter/trunk/src/core/org/apache/jmeter/NewDriver.java (original)
+++ jmeter/trunk/src/core/org/apache/jmeter/NewDriver.java Sun Feb 5 13:42:22 2017
@@ -28,8 +28,10 @@ import java.lang.reflect.Method;
import java.net.MalformedURLException;
import java.net.URL;
import java.security.AccessController;
+import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Date;
import java.util.LinkedList;
import java.util.List;
import java.util.StringTokenizer;
@@ -244,11 +246,9 @@ public final class NewDriver {
System.err.println("Configuration error during init, see exceptions:"+exceptionsToString(EXCEPTIONS_IN_INIT));
} else {
Thread.currentThread().setContextClassLoader(loader);
- if (System.getProperty("log4j.configuration") == null) {// $NON-NLS-1$ $NON-NLS-2$
- File conf = new File(JMETER_INSTALLATION_DIRECTORY, "bin" + File.separator + "log4j.conf");// $NON-NLS-1$ $NON-NLS-2$
- System.setProperty("log4j.configuration", "file:" + conf);
- }
-
+
+ setLoggingProperties(args);
+
try {
Class<?> initialClass = loader.loadClass("org.apache.jmeter.JMeter");// $NON-NLS-1$
Object instance = initialClass.newInstance();
@@ -276,4 +276,106 @@ public final class NewDriver {
}
return builder.toString();
}
+
+ /*
+ * Set logging related system properties.
+ */
+ private static void setLoggingProperties(String[] args) {
+ String jmLogFile = getCommandLineArgument(args, (int) 'j', "jmeterlogfile");// $NON-NLS-1$ $NON-NLS-2$
+
+ if (jmLogFile != null && !jmLogFile.isEmpty()) {
+ jmLogFile = replaceDateFormatInFileName(jmLogFile);
+ System.setProperty("jmeter.logfile", jmLogFile);// $NON-NLS-1$
+ } else if (System.getProperty("jmeter.logfile") == null) {// $NON-NLS-1$
+ System.setProperty("jmeter.logfile", "jmeter.log");// $NON-NLS-1$ $NON-NLS-2$
+ }
+
+ String jmLogConf = getCommandLineArgument(args, (int) 'i', "jmeterlogconf");// $NON-NLS-1$ $NON-NLS-2$
+ File logConfFile = null;
+
+ if (jmLogConf != null && !jmLogConf.isEmpty()) {
+ logConfFile = new File(jmLogConf);
+ } else if (System.getProperty("log4j.configurationFile") == null) {// $NON-NLS-1$
+ logConfFile = new File("log4j2.xml");// $NON-NLS-1$
+ if (!logConfFile.isFile()) {
+ logConfFile = new File(JMETER_INSTALLATION_DIRECTORY, "bin" + File.separator + "log4j2.xml");// $NON-NLS-1$ $NON-NLS-2$
+ }
+ }
+
+ if (logConfFile != null) {
+ System.setProperty("log4j.configurationFile", logConfFile.toURI().toString());// $NON-NLS-1$
+ }
+ }
+
+ /*
+ * Find command line argument option value by the id and name.
+ */
+ private static String getCommandLineArgument(String [] args, int id, String name) {
+ final String shortArgName = "-" + ((char) id);// $NON-NLS-1$
+ final String longArgName = "--" + name;// $NON-NLS-1$
+
+ String value = null;
+
+ for (int i = 0; i < args.length; i++) {
+ if (shortArgName.equals(args[i]) && i < args.length - 1) {
+ if (!args[i + 1].startsWith("-")) {// $NON-NLS-1$
+ value = args[i + 1];
+ }
+ break;
+ } else if (!shortArgName.equals(args[i]) && args[i].startsWith(shortArgName)) {
+ value = args[i].substring(shortArgName.length());
+ break;
+ } else if (longArgName.equals(args[i])) {
+ if (!args[i + 1].startsWith("-")) {// $NON-NLS-1$
+ value = args[i + 1];
+ }
+ break;
+ }
+ }
+
+ return value;
+ }
+
+ /*
+ * If the fileName contains at least one set of paired single-quotes, reformat using DateFormat
+ */
+ private static String replaceDateFormatInFileName(String fileName) {
+ try {
+ StringBuilder builder = new StringBuilder();
+
+ final Date date = new Date();
+ int fromIndex = 0;
+ int begin = fileName.indexOf('\'', fromIndex);// $NON-NLS-1$
+ int end;
+
+ String format;
+ SimpleDateFormat dateFormat;
+
+ while (begin != -1) {
+ builder.append(fileName.substring(fromIndex, begin));
+
+ fromIndex = begin + 1;
+ end = fileName.indexOf('\'', fromIndex);// $NON-NLS-1$
+ if (end == -1) {
+ throw new IllegalArgumentException("Invalid pairs of single-quotes in the file name: " + fileName);// $NON-NLS-1$
+ }
+
+ format = fileName.substring(begin + 1, end);
+ dateFormat = new SimpleDateFormat(format);
+ builder.append(dateFormat.format(date));
+
+ fromIndex = end + 1;
+ begin = fileName.indexOf('\'', fromIndex);// $NON-NLS-1$
+ }
+
+ if (fromIndex < fileName.length() - 1) {
+ builder.append(fileName.substring(fromIndex));
+ }
+
+ return builder.toString();
+ } catch (Exception ignored) {
+ }
+
+ return fileName;
+ }
}
Modified: jmeter/trunk/src/core/org/apache/jmeter/gui/GuiPackage.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/gui/GuiPackage.java?rev=1781756&r1=1781755&r2=1781756&view=diff
==============================================================================
--- jmeter/trunk/src/core/org/apache/jmeter/gui/GuiPackage.java (original)
+++ jmeter/trunk/src/core/org/apache/jmeter/gui/GuiPackage.java Sun Feb 5 13:42:22 2017
@@ -39,6 +39,7 @@ import org.apache.jmeter.exceptions.Ille
import org.apache.jmeter.gui.UndoHistory.HistoryListener;
import org.apache.jmeter.gui.action.TreeNodeNamingPolicy;
import org.apache.jmeter.gui.action.impl.DefaultTreeNodeNamingPolicy;
+import org.apache.jmeter.gui.logging.GuiLogEventBus;
import org.apache.jmeter.gui.tree.JMeterTreeListener;
import org.apache.jmeter.gui.tree.JMeterTreeModel;
import org.apache.jmeter.gui.tree.JMeterTreeNode;
@@ -71,10 +72,6 @@ public final class GuiPackage implements
/** Logging. */
private static final Logger log = LoggingManager.getLoggerForClass();
- private static final String NAMING_POLICY_IMPLEMENTATION =
- JMeterUtils.getPropDefault("naming_policy.impl", //$NON-NLS-1$
- DefaultTreeNodeNamingPolicy.class.getName());
-
/** Singleton instance. */
private static GuiPackage guiPack;
@@ -135,6 +132,11 @@ public final class GuiPackage implements
private UndoHistory undoHistory = new UndoHistory();
/**
+ * GUI Logging Event Bus.
+ */
+ private GuiLogEventBus logEventBus = new GuiLogEventBus();
+
+ /**
* Private constructor to permit instantiation only from within this class.
* Use {@link #getInstance()} to retrieve a singleton instance.
*/
@@ -869,6 +871,10 @@ public final class GuiPackage implements
*/
public TreeNodeNamingPolicy getNamingPolicy() {
if(namingPolicy == null) {
+ final String NAMING_POLICY_IMPLEMENTATION =
+ JMeterUtils.getPropDefault("naming_policy.impl", //$NON-NLS-1$
+ DefaultTreeNodeNamingPolicy.class.getName());
+
try {
Class<?> implementationClass = Class.forName(NAMING_POLICY_IMPLEMENTATION);
this.namingPolicy = (TreeNodeNamingPolicy) implementationClass.newInstance();
@@ -881,4 +887,11 @@ public final class GuiPackage implements
return namingPolicy;
}
+ /**
+ * Return {@link GuiLogEventBus}.
+ * @return {@link GuiLogEventBus}
+ */
+ public GuiLogEventBus getLogEventBus() {
+ return logEventBus;
+ }
}
Modified: jmeter/trunk/src/core/org/apache/jmeter/gui/LoggerPanel.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/gui/LoggerPanel.java?rev=1781756&r1=1781755&r2=1781756&view=diff
==============================================================================
--- jmeter/trunk/src/core/org/apache/jmeter/gui/LoggerPanel.java (original)
+++ jmeter/trunk/src/core/org/apache/jmeter/gui/LoggerPanel.java Sun Feb 5 13:42:22 2017
@@ -27,26 +27,22 @@ import javax.swing.JTextArea;
import javax.swing.ScrollPaneConstants;
import javax.swing.SwingUtilities;
+import org.apache.jmeter.gui.logging.GuiLogEventListener;
+import org.apache.jmeter.gui.logging.LogEventObject;
import org.apache.jmeter.gui.util.JSyntaxTextArea;
import org.apache.jmeter.gui.util.JTextScrollPane;
import org.apache.jmeter.util.JMeterUtils;
-import org.apache.jorphan.logging.LoggingManager;
-import org.apache.log.LogEvent;
-import org.apache.log.LogTarget;
-import org.apache.log.format.PatternFormatter;
import org.fife.ui.rsyntaxtextarea.SyntaxConstants;
/**
* Panel that shows log events
*/
-public class LoggerPanel extends JPanel implements LogTarget {
+public class LoggerPanel extends JPanel implements GuiLogEventListener {
private static final long serialVersionUID = 6911128494402594429L;
private final JTextArea textArea;
- private final PatternFormatter format;
-
// Limit length of log content
private static final int LOGGER_PANEL_MAX_LENGTH =
JMeterUtils.getPropDefault("jmeter.loggerpanel.maxlength", 80000); // $NON-NLS-1$
@@ -60,7 +56,6 @@ public class LoggerPanel extends JPanel
*/
public LoggerPanel() {
textArea = init();
- format = new PatternFormatter(LoggingManager.DEFAULT_PATTERN + "\n"); // $NON-NLS-1$
}
private JTextArea init() { // WARNING: called from ctor so must not be overridden (i.e. must be private or final)
@@ -93,19 +88,19 @@ public class LoggerPanel extends JPanel
}
/* (non-Javadoc)
- * @see org.apache.log.LogTarget#processEvent(org.apache.log.LogEvent)
+ * @see org.apache.jmeter.gui.logging.GuiLogEventListener#processLogEvent(org.apache.jmeter.gui.logging.LogEventObject)
*/
@Override
- public void processEvent(final LogEvent logEvent) {
+ public void processLogEvent(final LogEventObject logEventObject) {
if(!LOGGER_PANEL_RECEIVE_WHEN_CLOSED && !GuiPackage.getInstance().getMenuItemLoggerPanel().getModel().isSelected()) {
return;
}
-
+
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
synchronized (textArea) {
- textArea.append(format.format(logEvent));
+ textArea.append(logEventObject.toString());
int currentLength = textArea.getText().length();
// If LOGGER_PANEL_MAX_LENGTH is 0, it means all log events are kept
if(LOGGER_PANEL_MAX_LENGTH != 0 && currentLength> LOGGER_PANEL_MAX_LENGTH) {
Modified: jmeter/trunk/src/core/org/apache/jmeter/gui/MainFrame.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/gui/MainFrame.java?rev=1781756&r1=1781755&r2=1781756&view=diff
==============================================================================
--- jmeter/trunk/src/core/org/apache/jmeter/gui/MainFrame.java (original)
+++ jmeter/trunk/src/core/org/apache/jmeter/gui/MainFrame.java Sun Feb 5 13:42:22 2017
@@ -80,6 +80,8 @@ import org.apache.jmeter.gui.action.Acti
import org.apache.jmeter.gui.action.ActionRouter;
import org.apache.jmeter.gui.action.KeyStrokes;
import org.apache.jmeter.gui.action.LoadDraggedFile;
+import org.apache.jmeter.gui.logging.GuiLogEventListener;
+import org.apache.jmeter.gui.logging.LogEventObject;
import org.apache.jmeter.gui.tree.JMeterCellRenderer;
import org.apache.jmeter.gui.tree.JMeterTreeListener;
import org.apache.jmeter.gui.tree.JMeterTreeNode;
@@ -98,10 +100,7 @@ import org.apache.jmeter.util.JMeterUtil
import org.apache.jorphan.gui.ComponentUtil;
import org.apache.jorphan.logging.LoggingManager;
import org.apache.jorphan.util.JOrphanUtils;
-import org.apache.log.LogEvent;
-import org.apache.log.LogTarget;
import org.apache.log.Logger;
-import org.apache.log.Priority;
/**
* The main JMeter frame, containing the menu bar, test tree, and an area for
@@ -508,10 +507,8 @@ public class MainFrame extends JFrame im
logPanel = createLoggerPanel();
errorsAndFatalsCounterLogTarget = new ErrorsAndFatalsCounterLogTarget();
- LoggingManager.addLogTargetToRootLogger(new LogTarget[]{
- logPanel,
- errorsAndFatalsCounterLogTarget
- });
+ GuiPackage.getInstance().getLogEventBus().registerEventListener(logPanel);
+ GuiPackage.getInstance().getLogEventBus().registerEventListener(errorsAndFatalsCounterLogTarget);
topAndDown.setTopComponent(mainPanel);
topAndDown.setBottomComponent(logPanel);
@@ -814,15 +811,14 @@ public class MainFrame extends JFrame im
}
/**
- *
+ * ErrorsAndFatalsCounterLogTarget.
*/
- public final class ErrorsAndFatalsCounterLogTarget implements LogTarget, Clearable {
+ public final class ErrorsAndFatalsCounterLogTarget implements GuiLogEventListener, Clearable {
public AtomicInteger errorOrFatal = new AtomicInteger(0);
@Override
- public void processEvent(LogEvent event) {
- if(event.getPriority().equals(Priority.ERROR) ||
- event.getPriority().equals(Priority.FATAL_ERROR)) {
+ public void processLogEvent(LogEventObject logEventObject) {
+ if (logEventObject.isMoreSpecificThanError()) {
final int newValue = errorOrFatal.incrementAndGet();
SwingUtilities.invokeLater(new Runnable() {
@Override
@@ -845,6 +841,7 @@ public class MainFrame extends JFrame im
}
});
}
+
}
Modified: jmeter/trunk/src/core/org/apache/jmeter/gui/action/What.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/gui/action/What.java?rev=1781756&r1=1781755&r2=1781756&view=diff
==============================================================================
--- jmeter/trunk/src/core/org/apache/jmeter/gui/action/What.java (original)
+++ jmeter/trunk/src/core/org/apache/jmeter/gui/action/What.java Sun Feb 5 13:42:22 2017
@@ -32,6 +32,8 @@ import org.apache.jmeter.testelement.Tes
import org.apache.jorphan.logging.LoggingManager;
import org.apache.jorphan.util.HeapDumper;
import org.apache.log.Logger;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.core.config.Configurator;
/**
*
@@ -66,9 +68,11 @@ public class What extends AbstractAction
System.out.println(guiClassName);
log.info("TestElement:"+te.getClass().getName()+", guiClassName:"+guiClassName);
} else if (ActionNames.DEBUG_ON.equals(e.getActionCommand())){
- LoggingManager.setPriorityFullName("DEBUG",te.getClass().getName());//$NON-NLS-1$
+ Configurator.setAllLevels(te.getClass().getName(), Level.DEBUG);
+ log.info("Log level set to DEBUG for " + te.getClass().getName());
} else if (ActionNames.DEBUG_OFF.equals(e.getActionCommand())){
- LoggingManager.setPriorityFullName("INFO",te.getClass().getName());//$NON-NLS-1$
+ Configurator.setAllLevels(te.getClass().getName(), Level.INFO);
+ log.info("Log level set to INFO for " + te.getClass().getName());
} else if (ActionNames.HEAP_DUMP.equals(e.getActionCommand())){
try {
String s = HeapDumper.dumpHeap();
Added: jmeter/trunk/src/core/org/apache/jmeter/gui/logging/GuiLogEventAppender.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/gui/logging/GuiLogEventAppender.java?rev=1781756&view=auto
==============================================================================
--- jmeter/trunk/src/core/org/apache/jmeter/gui/logging/GuiLogEventAppender.java (added)
+++ jmeter/trunk/src/core/org/apache/jmeter/gui/logging/GuiLogEventAppender.java Sun Feb 5 13:42:22 2017
@@ -0,0 +1,83 @@
+/*
+ * 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.jmeter.gui.logging;
+
+import java.io.Serializable;
+
+import org.apache.jmeter.gui.GuiPackage;
+import org.apache.logging.log4j.core.Filter;
+import org.apache.logging.log4j.core.Layout;
+import org.apache.logging.log4j.core.LogEvent;
+import org.apache.logging.log4j.core.StringLayout;
+import org.apache.logging.log4j.core.appender.AbstractAppender;
+import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
+import org.apache.logging.log4j.core.config.plugins.PluginElement;
+import org.apache.logging.log4j.core.config.plugins.PluginFactory;
+import org.apache.logging.log4j.core.layout.PatternLayout;
+
+/**
+ * Posts log events to a {@link GuiLogEventBus}.
+ */
+@Plugin(name = "GuiLogEvent", category = "Core", elementType = "appender", printObject = true)
+public class GuiLogEventAppender extends AbstractAppender {
+
+ protected GuiLogEventAppender(final String name, final Filter filter, final Layout<? extends Serializable> layout,
+ final boolean ignoreExceptions) {
+ super(name, filter, layout, ignoreExceptions);
+ }
+
+ @Override
+ public void append(LogEvent logEvent) {
+ // Note: GuiPackage class access SHOULD be always successful.
+ // For example, if it fails to get GuiPackage#getInstance() due to static member initialization failure
+ // (e.g, accessing JMeterUtils#getPropDefault(...) without initializing application properties),
+ // the error log can be detected as "Recursive call to appender ..." by Log4j2 LoggerControl,
+ // resulting in no meaningful error logs in the log appender targets.
+ GuiPackage instance = GuiPackage.getInstance();
+
+ if (instance != null) {
+ final String serializedString = getStringLayout().toSerializable(logEvent);
+
+ if (serializedString != null && !serializedString.isEmpty()) {
+ LogEventObject logEventObject = new LogEventObject(logEvent, serializedString);
+ instance.getLogEventBus().postEvent(logEventObject);
+ }
+ }
+ }
+
+ @PluginFactory
+ public static GuiLogEventAppender createAppender(@PluginAttribute("name") String name,
+ @PluginAttribute("ignoreExceptions") boolean ignoreExceptions,
+ @PluginElement("Layout") Layout<? extends Serializable> layout, @PluginElement("Filters") Filter filter) {
+ if (name == null) {
+ LOGGER.error("No name provided for GuiLogEventAppender");
+ return null;
+ }
+
+ if (layout == null) {
+ layout = PatternLayout.createDefaultLayout();
+ }
+
+ return new GuiLogEventAppender(name, filter, layout, ignoreExceptions);
+ }
+
+ public StringLayout getStringLayout() {
+ return (StringLayout) getLayout();
+ }
+}
Propchange: jmeter/trunk/src/core/org/apache/jmeter/gui/logging/GuiLogEventAppender.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: jmeter/trunk/src/core/org/apache/jmeter/gui/logging/GuiLogEventBus.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/gui/logging/GuiLogEventBus.java?rev=1781756&view=auto
==============================================================================
--- jmeter/trunk/src/core/org/apache/jmeter/gui/logging/GuiLogEventBus.java (added)
+++ jmeter/trunk/src/core/org/apache/jmeter/gui/logging/GuiLogEventBus.java Sun Feb 5 13:42:22 2017
@@ -0,0 +1,79 @@
+/*
+ * 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.jmeter.gui.logging;
+
+import java.util.Arrays;
+import java.util.LinkedHashSet;
+import java.util.Set;
+
+/**
+ * GUI Log Event Bus.
+ */
+public class GuiLogEventBus {
+
+ /**
+ * Registered GUI log event listeners array.
+ */
+ private GuiLogEventListener [] listeners;
+
+ /**
+ * Default constructor.
+ */
+ public GuiLogEventBus() {
+ }
+
+ /**
+ * Register a GUI log event listener ({@link GuiLogEventListener}).
+ * @param listener a GUI log event listener ({@link GuiLogEventListener})
+ */
+ public void registerEventListener(GuiLogEventListener listener) {
+ if (listeners == null) {
+ listeners = new GuiLogEventListener[] { listener };
+ } else {
+ Set<GuiLogEventListener> set = new LinkedHashSet<>(Arrays.asList(listeners));
+ set.add(listener);
+ GuiLogEventListener [] arr = new GuiLogEventListener[set.size()];
+ listeners = set.toArray(arr);
+ }
+ }
+
+ /**
+ * Unregister a GUI log event listener ({@link GuiLogEventListener}).
+ * @param listener a GUI log event listener ({@link GuiLogEventListener})
+ */
+ public void unregisterEventListener(GuiLogEventListener listener) {
+ if (listeners != null) {
+ Set<GuiLogEventListener> set = new LinkedHashSet<>(Arrays.asList(listeners));
+ set.remove(listener);
+ GuiLogEventListener [] arr = new GuiLogEventListener[set.size()];
+ listeners = set.toArray(arr);
+ }
+ }
+
+ /**
+ * Post a log event object.
+ * @param logEvent log event object
+ */
+ public void postEvent(LogEventObject logEventObject) {
+ if (listeners != null) {
+ for (GuiLogEventListener listener : listeners) {
+ listener.processLogEvent(logEventObject);
+ }
+ }
+ }
+}
Propchange: jmeter/trunk/src/core/org/apache/jmeter/gui/logging/GuiLogEventBus.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: jmeter/trunk/src/core/org/apache/jmeter/gui/logging/GuiLogEventListener.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/gui/logging/GuiLogEventListener.java?rev=1781756&view=auto
==============================================================================
--- jmeter/trunk/src/core/org/apache/jmeter/gui/logging/GuiLogEventListener.java (added)
+++ jmeter/trunk/src/core/org/apache/jmeter/gui/logging/GuiLogEventListener.java Sun Feb 5 13:42:22 2017
@@ -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.jmeter.gui.logging;
+
+import java.util.EventListener;
+
+/**
+ * GUI Log Event Listener.
+ */
+public interface GuiLogEventListener extends EventListener {
+
+ /**
+ * Process a log event object.
+ * @param logEventObject log event object
+ */
+ public void processLogEvent(LogEventObject logEventObject);
+
+}
Propchange: jmeter/trunk/src/core/org/apache/jmeter/gui/logging/GuiLogEventListener.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: jmeter/trunk/src/core/org/apache/jmeter/gui/logging/LogEventObject.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/gui/logging/LogEventObject.java?rev=1781756&view=auto
==============================================================================
--- jmeter/trunk/src/core/org/apache/jmeter/gui/logging/LogEventObject.java (added)
+++ jmeter/trunk/src/core/org/apache/jmeter/gui/logging/LogEventObject.java Sun Feb 5 13:42:22 2017
@@ -0,0 +1,75 @@
+/*
+ * 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.jmeter.gui.logging;
+
+import java.util.EventObject;
+
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.core.LogEvent;
+
+/**
+ * Log event object.
+ */
+public class LogEventObject extends EventObject {
+
+ private static final long serialVersionUID = 1L;
+
+ private Level level;
+ private String seralizedString;
+
+ public LogEventObject(Object source) {
+ this(source, null);
+ }
+
+ public LogEventObject(Object source, String seralizedString) {
+ super(source);
+ if (source instanceof LogEvent) {
+ level = ((LogEvent) source).getLevel();
+ }
+ this.seralizedString = seralizedString;
+ }
+
+ public boolean isMoreSpecificThanError() {
+ if (level != null) {
+ return level.isMoreSpecificThan(Level.ERROR);
+ }
+ return false;
+ }
+
+ public boolean isMoreSpecificThanWarn() {
+ if (level != null) {
+ return level.isMoreSpecificThan(Level.WARN);
+ }
+ return false;
+ }
+
+ public boolean isMoreSpecificThanInfo() {
+ if (level != null) {
+ return level.isMoreSpecificThan(Level.INFO);
+ }
+ return false;
+ }
+
+ @Override
+ public String toString() {
+ if (seralizedString != null) {
+ return seralizedString;
+ }
+ return super.toString();
+ }
+}
Propchange: jmeter/trunk/src/core/org/apache/jmeter/gui/logging/LogEventObject.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Modified: jmeter/trunk/src/core/org/apache/jmeter/samplers/SampleResult.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/samplers/SampleResult.java?rev=1781756&r1=1781755&r2=1781756&view=diff
==============================================================================
--- jmeter/trunk/src/core/org/apache/jmeter/samplers/SampleResult.java (original)
+++ jmeter/trunk/src/core/org/apache/jmeter/samplers/SampleResult.java Sun Feb 5 13:42:22 2017
@@ -33,9 +33,9 @@ import java.util.concurrent.TimeUnit;
import org.apache.jmeter.assertions.AssertionResult;
import org.apache.jmeter.gui.Searchable;
import org.apache.jmeter.util.JMeterUtils;
-import org.apache.jorphan.logging.LoggingManager;
import org.apache.jorphan.util.JOrphanUtils;
-import org.apache.log.Logger;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
// For unit tests, @see TestSampleResult
@@ -49,7 +49,7 @@ public class SampleResult implements Ser
private static final long serialVersionUID = 241L;
// Needs to be accessible from Test code
- static final Logger log = LoggingManager.getLoggerForClass();
+ static Logger log = LoggerFactory.getLogger(SampleResult.class);
/**
* The default encoding to be used if not overridden.
Modified: jmeter/trunk/src/core/org/apache/jmeter/util/JMeterUtils.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/util/JMeterUtils.java?rev=1781756&r1=1781755&r2=1781756&view=diff
==============================================================================
--- jmeter/trunk/src/core/org/apache/jmeter/util/JMeterUtils.java (original)
+++ jmeter/trunk/src/core/org/apache/jmeter/util/JMeterUtils.java Sun Feb 5 13:42:22 2017
@@ -141,21 +141,20 @@ public class JMeterUtils implements Unit
* @return the Properties from the file
* @see #getJMeterProperties()
* @see #loadJMeterProperties(String)
- * @see #initLogging()
* @see #initLocale()
*/
public static Properties getProperties(String file) {
loadJMeterProperties(file);
- initLogging();
initLocale();
return appProperties;
}
/**
* Initialise JMeter logging
+ * @deprecated
*/
+ @Deprecated
public static void initLogging() {
- LoggingManager.initializeLogging(appProperties);
}
/**