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);
     }
 
     /**