You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by mi...@apache.org on 2016/05/06 14:43:53 UTC

[43/50] logging-log4j2 git commit: LOG4J2-1179 modified and added benchmarks to compare parameterized message performance

LOG4J2-1179 modified and added benchmarks to compare parameterized message performance


Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/990d071d
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/990d071d
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/990d071d

Branch: refs/heads/LOG4J-1181
Commit: 990d071d838830fd69d1c31ae9edc23ee078d88b
Parents: 3f37f18
Author: rpopma <rp...@apache.org>
Authored: Fri May 6 02:25:47 2016 +0900
Committer: rpopma <rp...@apache.org>
Committed: Fri May 6 02:25:47 2016 +0900

----------------------------------------------------------------------
 .../core/appender/CountingNoOpAppender.java     |  56 +++++++
 .../async/perftest/CountingNoOpAppender.java    |  52 ------
 .../perf/jmh/AsyncAppenderLog4j1Benchmark.java  | 113 +++++++++----
 .../perf/jmh/AsyncAppenderLog4j2Benchmark.java  | 120 ++++++++++----
 .../perf/jmh/AsyncAppenderLogbackBenchmark.java | 118 +++++++++----
 .../log4j/perf/jmh/AsyncLoggersBenchmark.java   | 118 +++++++++----
 .../perf/jmh/MemoryHandlerJULBenchmark.java     | 164 +++++++++++++++++++
 .../log4j/perf/util/BenchmarkMessageParams.java |  42 +++++
 .../logging/log4j/perf/util/NoOpJULHandler.java |  41 +++++
 .../log4j/perf/util/NoOpLog4jAppender.java      |  44 +++++
 .../log4j/perf/util/NoOpLogbackAppender.java    |  33 ++++
 .../perf-log4j12-async-noOpAppender.xml         |  30 ++++
 .../perf-logback-async-noOpAppender.xml         |  31 ++++
 .../perf5AsyncApndNoLoc-noOpAppender.xml        |  31 ++++
 14 files changed, 810 insertions(+), 183 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/990d071d/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/CountingNoOpAppender.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/CountingNoOpAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/CountingNoOpAppender.java
new file mode 100644
index 0000000..a8e48dc
--- /dev/null
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/CountingNoOpAppender.java
@@ -0,0 +1,56 @@
+/*
+ * 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.logging.log4j.core.appender;
+
+import java.util.Objects;
+import java.util.concurrent.atomic.AtomicLong;
+
+import org.apache.logging.log4j.core.Layout;
+import org.apache.logging.log4j.core.LogEvent;
+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.PluginFactory;
+
+/**
+ * No-Operation Appender that counts events.
+ */
+@Plugin(name = "CountingNoOp", category = "Core", elementType = "appender", printObject = true)
+public class CountingNoOpAppender extends AbstractAppender  {
+
+    private AtomicLong total = new AtomicLong();
+
+    public CountingNoOpAppender(String name, Layout<?> layout) {
+        super(name, null, layout);
+    }
+
+    public long getCount() {
+        return total.get();
+    }
+
+    @Override
+    public void append(LogEvent event) {
+        total.incrementAndGet();
+    }
+
+    /**
+     * Creates a CountingNoOp Appender.
+     */
+    @PluginFactory
+    public static CountingNoOpAppender createAppender(@PluginAttribute("name") final String name) {
+        return new CountingNoOpAppender(Objects.requireNonNull(name), null);
+    }
+}

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/990d071d/log4j-core/src/test/java/org/apache/logging/log4j/core/async/perftest/CountingNoOpAppender.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/async/perftest/CountingNoOpAppender.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/async/perftest/CountingNoOpAppender.java
deleted file mode 100644
index bb92bcf..0000000
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/async/perftest/CountingNoOpAppender.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache license, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the license for the specific language governing permissions and
- * limitations under the license.
- */
-package org.apache.logging.log4j.core.async.perftest;
-
-import java.util.Objects;
-
-import org.apache.logging.log4j.core.Layout;
-import org.apache.logging.log4j.core.LogEvent;
-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.PluginFactory;
-
-/**
- * No-Operation Appender that counts events.
- */
-@Plugin(name = "CountingNoOp", category = "Core", elementType = "appender", printObject = true)
-public class CountingNoOpAppender extends AbstractAppender  {
-
-    public static long total;
-
-    public CountingNoOpAppender(String name, Layout<?> layout) {
-        super(name, null, layout);
-    }
-
-    @Override
-    public void append(LogEvent event) {
-        total++;
-    }
-
-    /**
-     * Creates a CountingNoOp Appender.
-     */
-    @PluginFactory
-    public static CountingNoOpAppender createAppender(@PluginAttribute("name") final String name) {
-        return new CountingNoOpAppender(Objects.requireNonNull(name), null);
-    }
-}

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/990d071d/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/AsyncAppenderLog4j1Benchmark.java
----------------------------------------------------------------------
diff --git a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/AsyncAppenderLog4j1Benchmark.java b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/AsyncAppenderLog4j1Benchmark.java
index db35fbb..8a94382 100644
--- a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/AsyncAppenderLog4j1Benchmark.java
+++ b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/AsyncAppenderLog4j1Benchmark.java
@@ -22,6 +22,7 @@ import java.util.concurrent.TimeUnit;
 
 import org.apache.log4j.LogManager;
 import org.apache.log4j.Logger;
+import org.apache.logging.log4j.perf.util.BenchmarkMessageParams;
 import org.openjdk.jmh.annotations.Benchmark;
 import org.openjdk.jmh.annotations.BenchmarkMode;
 import org.openjdk.jmh.annotations.Level;
@@ -31,6 +32,7 @@ import org.openjdk.jmh.annotations.Scope;
 import org.openjdk.jmh.annotations.Setup;
 import org.openjdk.jmh.annotations.State;
 import org.openjdk.jmh.annotations.TearDown;
+import static org.apache.logging.log4j.perf.util.BenchmarkMessageParams.*;
 
 /**
  * Tests Log4j-1.2 Async Appender performance.
@@ -46,56 +48,103 @@ import org.openjdk.jmh.annotations.TearDown;
 // Usage help:
 // java -jar log4j-perf/target/benchmarks.jar -help
 //
+@State(Scope.Benchmark)
 public class AsyncAppenderLog4j1Benchmark {
+    Logger logger;
 
-    final static char[] CHARS = new char[500];
-    static {
-        Arrays.fill(CHARS, 'a');
+    @Setup(Level.Trial)
+    public void up() {
+        System.setProperty("log4j.configuration", "perf-log4j12-async-noOpAppender.xml");
+        logger = LogManager.getLogger(getClass());
     }
-    final static String TEST = new String(CHARS);
-
-    @State(Scope.Benchmark)
-    public static class NormalState {
-        Logger logger;
-
-        @Setup(Level.Trial)
-        public void up() {
-            System.setProperty("log4j.configuration", "perf-log4j12-async.xml");
-            logger = LogManager.getLogger(getClass());
-        }
-
-        @TearDown(Level.Trial)
-        public void down() {
-            LogManager.shutdown();
-            new File("perftest.log").delete();
-        }
+
+    @TearDown(Level.Trial)
+    public void down() {
+        LogManager.shutdown();
+        new File("perftest.log").delete();
+    }
+
+    @Benchmark
+    @BenchmarkMode(Mode.Throughput)
+    @OutputTimeUnit(TimeUnit.SECONDS)
+    public void throughputSimple() {
+        logger.info(BenchmarkMessageParams.TEST);
     }
 
     @Benchmark
     @BenchmarkMode(Mode.Throughput)
     @OutputTimeUnit(TimeUnit.SECONDS)
-    public boolean throughputBaseline(final NormalState e) {
-        return e.logger.isInfoEnabled();
+    public void throughput1Param() {
+        logger.info("p1=" + one);
     }
 
     @Benchmark
     @BenchmarkMode(Mode.Throughput)
     @OutputTimeUnit(TimeUnit.SECONDS)
-    public void throughput(final NormalState e) {
-        e.logger.info(TEST);
+    public void throughput2Params() {
+        logger.info("p1=" + one + ", p2=" + two);
     }
 
     @Benchmark
-    @BenchmarkMode(Mode.SampleTime)
-    @OutputTimeUnit(TimeUnit.NANOSECONDS)
-    public boolean latencyBaseline(final NormalState e) {
-        return e.logger.isInfoEnabled();
+    @BenchmarkMode(Mode.Throughput)
+    @OutputTimeUnit(TimeUnit.SECONDS)
+    public void throughput3Params() {
+        logger.info("p1=" + one + ", p2=" + two + ", p3=" + three);
+    }
+
+    @Benchmark
+    @BenchmarkMode(Mode.Throughput)
+    @OutputTimeUnit(TimeUnit.SECONDS)
+    public void throughput4Params() {
+        logger.info("p1=" + one + ", p2=" + two + ", p3=" + three + ", p4=" + four);
+    }
+
+    @Benchmark
+    @BenchmarkMode(Mode.Throughput)
+    @OutputTimeUnit(TimeUnit.SECONDS)
+    public void throughput5Params() {
+        logger.info("p1=" + one + ", p2=" + two + ", p3=" + three + ", p4=" + four + ", p5=" + five);
+    }
+
+    @Benchmark
+    @BenchmarkMode(Mode.Throughput)
+    @OutputTimeUnit(TimeUnit.SECONDS)
+    public void throughput6Params() {
+        logger.info("p1=" + one + ", p2=" + two + ", p3=" + three + ", p4=" + four + ", p5=" + five + ", p6=" + six);
     }
 
     @Benchmark
-    @BenchmarkMode(Mode.SampleTime)
-    @OutputTimeUnit(TimeUnit.NANOSECONDS)
-    public void latency(final NormalState e) {
-        e.logger.info(TEST);
+    @BenchmarkMode(Mode.Throughput)
+    @OutputTimeUnit(TimeUnit.SECONDS)
+    public void throughput7Params() {
+        logger.info("p1=" + one + ", p2=" + two + ", p3=" + three + ", p4=" + four + ", p5=" + five + ", p6=" + six + ", p7=" + seven);
+    }
+
+    @Benchmark
+    @BenchmarkMode(Mode.Throughput)
+    @OutputTimeUnit(TimeUnit.SECONDS)
+    public void throughput8Params() {
+        logger.info("p1=" + one + ", p2=" + two + ", p3=" + three + ", p4=" + four + ", p5=" + five + ", p6=" + six + ", p7=" + seven + ", p8=" + eight);
+    }
+
+    @Benchmark
+    @BenchmarkMode(Mode.Throughput)
+    @OutputTimeUnit(TimeUnit.SECONDS)
+    public void throughput9Params() {
+        logger.info("p1=" + one + ", p2=" + two + ", p3=" + three + ", p4=" + four + ", p5=" + five + ", p6=" + six + ", p7=" + seven + ", p8=" + eight + ", p9=" + nine);
+    }
+
+    @Benchmark
+    @BenchmarkMode(Mode.Throughput)
+    @OutputTimeUnit(TimeUnit.SECONDS)
+    public void throughput10Params() {
+        logger.info("p1=" + one + ", p2=" + two + ", p3=" + three + ", p4=" + four + ", p5=" + five + ", p6=" + six + ", p7=" + seven + ", p8=" + eight + ", p9=" + nine + ", p10=" + ten);
+    }
+
+    @Benchmark
+    @BenchmarkMode(Mode.Throughput)
+    @OutputTimeUnit(TimeUnit.SECONDS)
+    public void throughput11Params() {
+        logger.info("p1=" + one + ", p2=" + two + ", p3=" + three + ", p4=" + four + ", p5=" + five + ", p6=" + six + ", p7=" + seven + ", p8=" + eight + ", p9=" + nine + ", p10=" + ten + ", p11=" + eleven);
     }
 }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/990d071d/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/AsyncAppenderLog4j2Benchmark.java
----------------------------------------------------------------------
diff --git a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/AsyncAppenderLog4j2Benchmark.java b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/AsyncAppenderLog4j2Benchmark.java
index 523b029..77fab56 100644
--- a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/AsyncAppenderLog4j2Benchmark.java
+++ b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/AsyncAppenderLog4j2Benchmark.java
@@ -17,12 +17,12 @@
 package org.apache.logging.log4j.perf.jmh;
 
 import java.io.File;
-import java.util.Arrays;
 import java.util.concurrent.TimeUnit;
 
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.core.LifeCycle;
+import org.apache.logging.log4j.perf.util.BenchmarkMessageParams;
 import org.openjdk.jmh.annotations.Benchmark;
 import org.openjdk.jmh.annotations.BenchmarkMode;
 import org.openjdk.jmh.annotations.Level;
@@ -33,6 +33,8 @@ import org.openjdk.jmh.annotations.Setup;
 import org.openjdk.jmh.annotations.State;
 import org.openjdk.jmh.annotations.TearDown;
 
+import static org.apache.logging.log4j.perf.util.BenchmarkMessageParams.*;
+
 /**
  * Tests Log4j2 Async Appender performance.
  */
@@ -47,55 +49,107 @@ import org.openjdk.jmh.annotations.TearDown;
 // Usage help:
 // java -jar log4j-perf/target/benchmarks.jar -help
 //
+@State(Scope.Benchmark)
 public class AsyncAppenderLog4j2Benchmark {
-    final static char[] CHARS = new char[500];
-    static {
-        Arrays.fill(CHARS, 'a');
+    Logger logger;
+
+    @Setup(Level.Trial)
+    public void up() {
+        System.setProperty("log4j.configurationFile", "perf5AsyncApndNoLoc-noOpAppender.xml");
+        logger = LogManager.getLogger(getClass());
+    }
+
+    @TearDown(Level.Trial)
+    public void down() {
+        ((LifeCycle) LogManager.getContext(false)).stop();
+        new File("perftest.log").delete();
+    }
+
+    @Benchmark
+    @BenchmarkMode(Mode.Throughput)
+    @OutputTimeUnit(TimeUnit.SECONDS)
+    public void throughputSimple() {
+        logger.info(BenchmarkMessageParams.TEST);
+    }
+
+    @Benchmark
+    @BenchmarkMode(Mode.Throughput)
+    @OutputTimeUnit(TimeUnit.SECONDS)
+    public void throughput1Param() {
+        logger.info("p1={}", one);
     }
-    final static String TEST = new String(CHARS);
-
-    @State(Scope.Benchmark)
-    public static class NormalState {
-        Logger logger;
-
-        @Setup(Level.Trial)
-        public void up() {
-            System.setProperty("log4j.configurationFile", "perf5AsyncApndNoLoc.xml");
-            logger = LogManager.getLogger(getClass());
-        }
-
-        @TearDown(Level.Trial)
-        public void down() {
-            ((LifeCycle) LogManager.getContext(false)).stop();
-            new File("perftest.log").delete();
-        }
+
+    @Benchmark
+    @BenchmarkMode(Mode.Throughput)
+    @OutputTimeUnit(TimeUnit.SECONDS)
+    public void throughput2Params() {
+        logger.info("p1={}, p2={}", one, two);
     }
 
     @Benchmark
     @BenchmarkMode(Mode.Throughput)
     @OutputTimeUnit(TimeUnit.SECONDS)
-    public boolean throughputBaseline(final NormalState e) {
-        return e.logger.isInfoEnabled();
+    public void throughput3Params() {
+        logger.info("p1={}, p2={}, p3={}", one, two, three);
     }
 
     @Benchmark
     @BenchmarkMode(Mode.Throughput)
     @OutputTimeUnit(TimeUnit.SECONDS)
-    public void throughput(final NormalState e) {
-        e.logger.info(TEST);
+    public void throughput4Params() {
+        logger.info("p1={}, p2={}, p3={}, p4={}", one, two, three, four);
     }
 
     @Benchmark
-    @BenchmarkMode(Mode.SampleTime)
-    @OutputTimeUnit(TimeUnit.NANOSECONDS)
-    public boolean latencyBaseline(final NormalState e) {
-        return e.logger.isInfoEnabled();
+    @BenchmarkMode(Mode.Throughput)
+    @OutputTimeUnit(TimeUnit.SECONDS)
+    public void throughput5Params() {
+        logger.info("p1={}, p2={}, p3={}, p4={}, p5={}", one, two, three, four, five);
     }
 
     @Benchmark
-    @BenchmarkMode(Mode.SampleTime)
-    @OutputTimeUnit(TimeUnit.NANOSECONDS)
-    public void latency(final NormalState e) {
-        e.logger.info(TEST);
+    @BenchmarkMode(Mode.Throughput)
+    @OutputTimeUnit(TimeUnit.SECONDS)
+    public void throughput6Params() {
+        logger.info("p1={}, p2={}, p3={}, p4={}, p5={}, p6={}", one, two, three, four, five, six);
+    }
+
+    @Benchmark
+    @BenchmarkMode(Mode.Throughput)
+    @OutputTimeUnit(TimeUnit.SECONDS)
+    public void throughput7Params() {
+        logger.info("p1={}, p2={}, p3={}, p4={}, p5={}, p6={}, p7={}", one, two, three, four, five, six, seven);
+    }
+
+    @Benchmark
+    @BenchmarkMode(Mode.Throughput)
+    @OutputTimeUnit(TimeUnit.SECONDS)
+    public void throughput8Params() {
+        logger.info("p1={}, p2={}, p3={}, p4={}, p5={}, p6={}, p7={}, p8={}", one, two, three, four, five, six, seven,
+                eight);
+    }
+
+    @Benchmark
+    @BenchmarkMode(Mode.Throughput)
+    @OutputTimeUnit(TimeUnit.SECONDS)
+    public void throughput9Params() {
+        logger.info("p1={}, p2={}, p3={}, p4={}, p5={}, p6={}, p7={}, p8={}, p9={}", one, two, three, four, five, six,
+                seven, eight, nine);
+    }
+
+    @Benchmark
+    @BenchmarkMode(Mode.Throughput)
+    @OutputTimeUnit(TimeUnit.SECONDS)
+    public void throughput10Params() {
+        logger.info("p1={}, p2={}, p3={}, p4={}, p5={}, p6={}, p7={}, p8={}, p9={}, p10={}", one, two, three, four,
+                five, six, seven, eight, nine, ten);
+    }
+
+    @Benchmark
+    @BenchmarkMode(Mode.Throughput)
+    @OutputTimeUnit(TimeUnit.SECONDS)
+    public void throughput11Params() {
+        logger.info("p1={}, p2={}, p3={}, p4={}, p5={}, p6={}, p7={}, p8={}, p9={}, p10={}, p11={}", one, two, three,
+                four, five, six, seven, eight, nine, ten, eleven);
     }
 }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/990d071d/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/AsyncAppenderLogbackBenchmark.java
----------------------------------------------------------------------
diff --git a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/AsyncAppenderLogbackBenchmark.java b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/AsyncAppenderLogbackBenchmark.java
index 5c8c5cc..45f0e88 100644
--- a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/AsyncAppenderLogbackBenchmark.java
+++ b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/AsyncAppenderLogbackBenchmark.java
@@ -20,6 +20,7 @@ import java.io.File;
 import java.util.Arrays;
 import java.util.concurrent.TimeUnit;
 
+import org.apache.logging.log4j.perf.util.BenchmarkMessageParams;
 import org.openjdk.jmh.annotations.Benchmark;
 import org.openjdk.jmh.annotations.BenchmarkMode;
 import org.openjdk.jmh.annotations.Level;
@@ -31,6 +32,7 @@ import org.openjdk.jmh.annotations.State;
 import org.openjdk.jmh.annotations.TearDown;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import static org.apache.logging.log4j.perf.util.BenchmarkMessageParams.*;
 
 import ch.qos.logback.core.spi.LifeCycle;
 
@@ -48,56 +50,108 @@ import ch.qos.logback.core.spi.LifeCycle;
 // Usage help:
 // java -jar log4j-perf/target/benchmarks.jar -help
 //
+@State(Scope.Benchmark)
 public class AsyncAppenderLogbackBenchmark {
 
-    final static char[] CHARS = new char[500];
-    static {
-        Arrays.fill(CHARS, 'a');
+    private Logger logger;
+
+    @Setup(Level.Trial)
+    public void up() {
+        System.setProperty("logback.configurationFile", "perf-logback-async-noOpAppender.xml");
+        logger = LoggerFactory.getLogger(getClass());
+    }
+
+    @TearDown(Level.Trial)
+    public void down() {
+        ((LifeCycle) LoggerFactory.getILoggerFactory()).stop();
+        new File("perftest.log").delete();
+    }
+
+    @Benchmark
+    @BenchmarkMode(Mode.Throughput)
+    @OutputTimeUnit(TimeUnit.SECONDS)
+    public void throughputSimple() {
+        logger.info(BenchmarkMessageParams.TEST);
+    }
+
+    @Benchmark
+    @BenchmarkMode(Mode.Throughput)
+    @OutputTimeUnit(TimeUnit.SECONDS)
+    public void throughput1Param() {
+        logger.info("p1={}", one);
+    }
+
+    @Benchmark
+    @BenchmarkMode(Mode.Throughput)
+    @OutputTimeUnit(TimeUnit.SECONDS)
+    public void throughput2Params() {
+        logger.info("p1={}, p2={}", one, two);
+    }
+
+    @Benchmark
+    @BenchmarkMode(Mode.Throughput)
+    @OutputTimeUnit(TimeUnit.SECONDS)
+    public void throughput3Params() {
+        logger.info("p1={}, p2={}, p3={}", one, two, three);
     }
-    final static String TEST = new String(CHARS);
-
-    @State(Scope.Benchmark)
-    public static class NormalState {
-        Logger logger;
-
-        @Setup(Level.Trial)
-        public void up() {
-            System.setProperty("logback.configurationFile", "perf-logback-async.xml");
-            logger = LoggerFactory.getLogger(getClass());
-        }
-
-        @TearDown(Level.Trial)
-        public void down() {
-            ((LifeCycle) LoggerFactory.getILoggerFactory()).stop();
-            new File("perftest.log").delete();
-        }
+
+    @Benchmark
+    @BenchmarkMode(Mode.Throughput)
+    @OutputTimeUnit(TimeUnit.SECONDS)
+    public void throughput4Params() {
+        logger.info("p1={}, p2={}, p3={}, p4={}", one, two, three, four);
+    }
+
+    @Benchmark
+    @BenchmarkMode(Mode.Throughput)
+    @OutputTimeUnit(TimeUnit.SECONDS)
+    public void throughput5Params() {
+        logger.info("p1={}, p2={}, p3={}, p4={}, p5={}", one, two, three, four, five);
     }
 
     @Benchmark
     @BenchmarkMode(Mode.Throughput)
     @OutputTimeUnit(TimeUnit.SECONDS)
-    public boolean throughputBaseline(final NormalState e) {
-        return e.logger.isInfoEnabled();
+    public void throughput6Params() {
+        logger.info("p1={}, p2={}, p3={}, p4={}, p5={}, p6={}", one, two, three, four, five, six);
     }
 
     @Benchmark
     @BenchmarkMode(Mode.Throughput)
     @OutputTimeUnit(TimeUnit.SECONDS)
-    public void throughput(final NormalState e) {
-        e.logger.info(TEST);
+    public void throughput7Params() {
+        logger.info("p1={}, p2={}, p3={}, p4={}, p5={}, p6={}, p7={}", one, two, three, four, five, six, seven);
     }
 
     @Benchmark
-    @BenchmarkMode(Mode.SampleTime)
-    @OutputTimeUnit(TimeUnit.NANOSECONDS)
-    public boolean latencyBaseline(final NormalState e) {
-        return e.logger.isInfoEnabled();
+    @BenchmarkMode(Mode.Throughput)
+    @OutputTimeUnit(TimeUnit.SECONDS)
+    public void throughput8Params() {
+        logger.info("p1={}, p2={}, p3={}, p4={}, p5={}, p6={}, p7={}, p8={}", one, two, three, four, five, six, seven,
+                eight);
     }
 
     @Benchmark
-    @BenchmarkMode(Mode.SampleTime)
-    @OutputTimeUnit(TimeUnit.NANOSECONDS)
-    public void latency(final NormalState e) {
-        e.logger.info(TEST);
+    @BenchmarkMode(Mode.Throughput)
+    @OutputTimeUnit(TimeUnit.SECONDS)
+    public void throughput9Params() {
+        logger.info("p1={}, p2={}, p3={}, p4={}, p5={}, p6={}, p7={}, p8={}, p9={}", one, two, three, four, five, six,
+                seven, eight, nine);
+    }
+
+    @Benchmark
+    @BenchmarkMode(Mode.Throughput)
+    @OutputTimeUnit(TimeUnit.SECONDS)
+    public void throughput10Params() {
+        logger.info("p1={}, p2={}, p3={}, p4={}, p5={}, p6={}, p7={}, p8={}, p9={}, p10={}", one, two, three, four,
+                five, six, seven, eight, nine, ten);
+    }
+
+    @Benchmark
+    @BenchmarkMode(Mode.Throughput)
+    @OutputTimeUnit(TimeUnit.SECONDS)
+    public void throughput11Params() {
+        logger.info("p1={}, p2={}, p3={}, p4={}, p5={}, p6={}, p7={}, p8={}, p9={}, p10={}, p11={}", one, two, three,
+                four, five, six, seven, eight, nine, ten, eleven);
     }
 }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/990d071d/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/AsyncLoggersBenchmark.java
----------------------------------------------------------------------
diff --git a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/AsyncLoggersBenchmark.java b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/AsyncLoggersBenchmark.java
index c1714e1..6a160f9 100644
--- a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/AsyncLoggersBenchmark.java
+++ b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/AsyncLoggersBenchmark.java
@@ -18,12 +18,12 @@
 package org.apache.logging.log4j.perf.jmh;
 
 import java.io.File;
-import java.util.Arrays;
 import java.util.concurrent.TimeUnit;
 
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.core.LifeCycle;
+import org.apache.logging.log4j.perf.util.BenchmarkMessageParams;
 import org.openjdk.jmh.annotations.Benchmark;
 import org.openjdk.jmh.annotations.BenchmarkMode;
 import org.openjdk.jmh.annotations.Level;
@@ -34,6 +34,8 @@ import org.openjdk.jmh.annotations.Setup;
 import org.openjdk.jmh.annotations.State;
 import org.openjdk.jmh.annotations.TearDown;
 
+import static org.apache.logging.log4j.perf.util.BenchmarkMessageParams.*;
+
 /**
  * Tests Log4j2 Async Loggers performance.
  */
@@ -50,11 +52,6 @@ import org.openjdk.jmh.annotations.TearDown;
 //
 @State(Scope.Thread)
 public class AsyncLoggersBenchmark {
-    final static char[] CHARS = new char[16];
-    static {
-        Arrays.fill(CHARS, 'a');
-    }
-    final static String TEST = new String(CHARS);
 
     Logger logger;
 
@@ -81,69 +78,122 @@ public class AsyncLoggersBenchmark {
     @BenchmarkMode(Mode.Throughput)
     @OutputTimeUnit(TimeUnit.SECONDS)
     public void throughputSimple() {
-        logger.info(TEST);
+        logger.info(BenchmarkMessageParams.TEST);
+    }
+
+    @Benchmark
+    @BenchmarkMode(Mode.Throughput)
+    @OutputTimeUnit(TimeUnit.SECONDS)
+    public void throughput1Param() {
+        logger.info("p1={}", one);
+    }
+
+    @Benchmark
+    @BenchmarkMode(Mode.Throughput)
+    @OutputTimeUnit(TimeUnit.SECONDS)
+    public void throughput2Params() {
+        logger.info("p1={}, p2={}", one, two);
     }
 
     @Benchmark
     @BenchmarkMode(Mode.Throughput)
     @OutputTimeUnit(TimeUnit.SECONDS)
     public void throughput3Params() {
-        logger.info("p1={}, p2={}, p3={}", "1", "2", "3");
+        logger.info("p1={}, p2={}, p3={}", one, two, three);
     }
 
     @Benchmark
     @BenchmarkMode(Mode.Throughput)
     @OutputTimeUnit(TimeUnit.SECONDS)
-    public void throughput5Params() {
-        logger.info("p1={}, p2={}, p3={}, p4={}, p5={}", "1", "2", "3", "4", "5");
+    public void throughput4Params() {
+        logger.info("p1={}, p2={}, p3={}, p4={}", one, two, three, four);
     }
 
     @Benchmark
     @BenchmarkMode(Mode.Throughput)
     @OutputTimeUnit(TimeUnit.SECONDS)
-    public void throughput7Params() {
-        logger.info("p1={}, p2={}, p3={}, p4={}, p5={}, p6={}, p7={}", "1", "2", "3", "4", "5", "6", "7");
+    public void throughput5Params() {
+        logger.info("p1={}, p2={}, p3={}, p4={}, p5={}", one, two, three, four, five);
     }
 
     @Benchmark
     @BenchmarkMode(Mode.Throughput)
     @OutputTimeUnit(TimeUnit.SECONDS)
-    public void throughput9Params() {
-        logger.info("p1={}, p2={}, p3={}, p4={}, p5={}, p6={}, p7={}, p8={}, p9={}", "1", "2", "3", "4", "5", "6", "7", "8", "9");
+    public void throughput6Params() {
+        logger.info("p1={}, p2={}, p3={}, p4={}, p5={}, p6={}", one, two, three, four, five, six);
     }
 
     @Benchmark
-    @BenchmarkMode(Mode.SampleTime)
-    @OutputTimeUnit(TimeUnit.NANOSECONDS)
-    public void latencySimple() {
-        logger.info(TEST);
+    @BenchmarkMode(Mode.Throughput)
+    @OutputTimeUnit(TimeUnit.SECONDS)
+    public void throughput7Params() {
+        logger.info("p1={}, p2={}, p3={}, p4={}, p5={}, p6={}, p7={}", one, two, three, four, five, six, seven);
     }
 
     @Benchmark
-    @BenchmarkMode(Mode.SampleTime)
-    @OutputTimeUnit(TimeUnit.NANOSECONDS)
-    public void latency3Params() {
-        logger.info("p1={}, p2={}, p3={}", "1", "2", "3");
+    @BenchmarkMode(Mode.Throughput)
+    @OutputTimeUnit(TimeUnit.SECONDS)
+    public void throughput8Params() {
+        logger.info("p1={}, p2={}, p3={}, p4={}, p5={}, p6={}, p7={}, p8={}", one, two, three, four, five, six, seven,
+                eight);
     }
 
     @Benchmark
-    @BenchmarkMode(Mode.SampleTime)
-    @OutputTimeUnit(TimeUnit.NANOSECONDS)
-    public void latency5Params() {
-        logger.info("p1={}, p2={}, p3={}, p4={}, p5={}", "1", "2", "3", "4", "5");
+    @BenchmarkMode(Mode.Throughput)
+    @OutputTimeUnit(TimeUnit.SECONDS)
+    public void throughput9Params() {
+        logger.info("p1={}, p2={}, p3={}, p4={}, p5={}, p6={}, p7={}, p8={}, p9={}", one, two, three, four, five, six,
+                seven, eight, nine);
     }
 
     @Benchmark
-    @BenchmarkMode(Mode.SampleTime)
-    @OutputTimeUnit(TimeUnit.NANOSECONDS)
-    public void latency7Params() {
-        logger.info("p1={}, p2={}, p3={}, p4={}, p5={}, p6={}, p7={}", "1", "2", "3", "4", "5", "6", "7");
+    @BenchmarkMode(Mode.Throughput)
+    @OutputTimeUnit(TimeUnit.SECONDS)
+    public void throughput10Params() {
+        logger.info("p1={}, p2={}, p3={}, p4={}, p5={}, p6={}, p7={}, p8={}, p9={}, p10={}", one, two, three, four,
+                five, six, seven, eight, nine, ten);
     }
 
     @Benchmark
-    @BenchmarkMode(Mode.SampleTime)
-    @OutputTimeUnit(TimeUnit.NANOSECONDS)
-    public void latency9Params() {
-        logger.info("p1={}, p2={}, p3={}, p4={}, p5={}, p6={}, p7={}, p8={}, p9={}", "1", "2", "3", "4", "5", "6", "7", "8", "9");
+    @BenchmarkMode(Mode.Throughput)
+    @OutputTimeUnit(TimeUnit.SECONDS)
+    public void throughput11Params() {
+        logger.info("p1={}, p2={}, p3={}, p4={}, p5={}, p6={}, p7={}, p8={}, p9={}, p10={}, p11={}", one, two, three,
+                four, five, six, seven, eight, nine, ten, eleven);
     }
+
+//    @Benchmark
+//    @BenchmarkMode(Mode.SampleTime)
+//    @OutputTimeUnit(TimeUnit.NANOSECONDS)
+//    public void latencySimple() {
+//        logger.info(TEST);
+//    }
+//
+//    @Benchmark
+//    @BenchmarkMode(Mode.SampleTime)
+//    @OutputTimeUnit(TimeUnit.NANOSECONDS)
+//    public void latency3Params() {
+//        logger.info("p1={}, p2={}, p3={}", "1", "2", "3");
+//    }
+//
+//    @Benchmark
+//    @BenchmarkMode(Mode.SampleTime)
+//    @OutputTimeUnit(TimeUnit.NANOSECONDS)
+//    public void latency5Params() {
+//        logger.info("p1={}, p2={}, p3={}, p4={}, p5={}", "1", "2", "3", "4", "5");
+//    }
+//
+//    @Benchmark
+//    @BenchmarkMode(Mode.SampleTime)
+//    @OutputTimeUnit(TimeUnit.NANOSECONDS)
+//    public void latency7Params() {
+//        logger.info("p1={}, p2={}, p3={}, p4={}, p5={}, p6={}, p7={}", "1", "2", "3", "4", "5", "6", "7");
+//    }
+//
+//    @Benchmark
+//    @BenchmarkMode(Mode.SampleTime)
+//    @OutputTimeUnit(TimeUnit.NANOSECONDS)
+//    public void latency9Params() {
+//        logger.info("p1={}, p2={}, p3={}, p4={}, p5={}, p6={}, p7={}, p8={}, p9={}", "1", "2", "3", "4", "5", "6", "7", "8", "9");
+//    }
 }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/990d071d/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/MemoryHandlerJULBenchmark.java
----------------------------------------------------------------------
diff --git a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/MemoryHandlerJULBenchmark.java b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/MemoryHandlerJULBenchmark.java
new file mode 100644
index 0000000..a5044ac
--- /dev/null
+++ b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/MemoryHandlerJULBenchmark.java
@@ -0,0 +1,164 @@
+/*
+ * 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.logging.log4j.perf.jmh;
+
+import java.util.concurrent.TimeUnit;
+import java.util.logging.Logger;
+import java.util.logging.MemoryHandler;
+
+import org.apache.logging.log4j.perf.util.BenchmarkMessageParams;
+import org.apache.logging.log4j.perf.util.NoOpJULHandler;
+import org.openjdk.jmh.annotations.Benchmark;
+import org.openjdk.jmh.annotations.BenchmarkMode;
+import org.openjdk.jmh.annotations.Level;
+import org.openjdk.jmh.annotations.Mode;
+import org.openjdk.jmh.annotations.OutputTimeUnit;
+import org.openjdk.jmh.annotations.Scope;
+import org.openjdk.jmh.annotations.Setup;
+import org.openjdk.jmh.annotations.State;
+
+import static org.apache.logging.log4j.perf.util.BenchmarkMessageParams.*;
+
+/**
+ * Tests JUL (java.util.logging) Memory Handler performance.
+ */
+// ============================== HOW TO RUN THIS TEST: ====================================
+//
+// single thread:
+// java -jar log4j-perf/target/benchmarks.jar ".*MemoryHandlerJULBenchmark.*" -f 1 -wi 5 -i 5
+//
+// multiple threads (for example, 4 threads):
+// java -jar log4j-perf/target/benchmarks.jar ".*MemoryHandlerJULBenchmark.*" -f 1 -wi 5 -i 5 -t 4 -si true
+//
+// Usage help:
+// java -jar log4j-perf/target/benchmarks.jar -help
+//
+@State(Scope.Benchmark)
+public class MemoryHandlerJULBenchmark {
+
+    Logger logger;
+    MemoryHandler memoryHandler;
+
+    @Setup(Level.Trial)
+    public void up() {
+        memoryHandler = new MemoryHandler(new NoOpJULHandler(), 262144, java.util.logging.Level.SEVERE);
+        logger = java.util.logging.Logger.getLogger(getClass().getName());
+        logger.setUseParentHandlers(false);
+        logger.addHandler(memoryHandler);
+        logger.setLevel(java.util.logging.Level.ALL);
+    }
+
+    @Benchmark
+    @BenchmarkMode(Mode.Throughput)
+    @OutputTimeUnit(TimeUnit.SECONDS)
+    public void throughputSimple() {
+        logger.logp(java.util.logging.Level.INFO, getClass().getName(), "methodName", BenchmarkMessageParams.TEST);
+    }
+
+    @Benchmark
+    @BenchmarkMode(Mode.Throughput)
+    @OutputTimeUnit(TimeUnit.SECONDS)
+    public void throughput1Param() {
+        logger.logp(java.util.logging.Level.INFO, getClass().getName(), "methodName", "p1={}", one);
+    }
+
+    @Benchmark
+    @BenchmarkMode(Mode.Throughput)
+    @OutputTimeUnit(TimeUnit.SECONDS)
+    public void throughput2Params() {
+        logger.logp(java.util.logging.Level.INFO, getClass().getName(), "methodName", "p1={}, p2={}",
+                new Object[]{one, two});
+    }
+
+    @Benchmark
+    @BenchmarkMode(Mode.Throughput)
+    @OutputTimeUnit(TimeUnit.SECONDS)
+    public void throughput3Params() {
+        logger.logp(java.util.logging.Level.INFO, getClass().getName(), "methodName","p1={}, p2={}, p3={}",
+                new Object[]{one, two, three});
+    }
+
+    @Benchmark
+    @BenchmarkMode(Mode.Throughput)
+    @OutputTimeUnit(TimeUnit.SECONDS)
+    public void throughput4Params() {
+        logger.logp(java.util.logging.Level.INFO, getClass().getName(), "methodName",
+                "p1={}, p2={}, p3={}, p4={}", new Object[]{one, two, three, four,});
+    }
+
+    @Benchmark
+    @BenchmarkMode(Mode.Throughput)
+    @OutputTimeUnit(TimeUnit.SECONDS)
+    public void throughput5Params() {
+        logger.logp(java.util.logging.Level.INFO, getClass().getName(), "methodName",
+                "p1={}, p2={}, p3={}, p4={}, p5={}", new Object[]{one, two, three, four, five,});
+    }
+
+    @Benchmark
+    @BenchmarkMode(Mode.Throughput)
+    @OutputTimeUnit(TimeUnit.SECONDS)
+    public void throughput6Params() {
+        logger.logp(java.util.logging.Level.INFO, getClass().getName(), "methodName",
+                "p1={}, p2={}, p3={}, p4={}, p5={}, p6={}",
+                new Object[]{one, two, three, four, five, six,});
+    }
+
+    @Benchmark
+    @BenchmarkMode(Mode.Throughput)
+    @OutputTimeUnit(TimeUnit.SECONDS)
+    public void throughput7Params() {
+        logger.logp(java.util.logging.Level.INFO, getClass().getName(), "methodName",
+                "p1={}, p2={}, p3={}, p4={}, p5={}, p6={}, p7={}",
+                new Object[]{one, two, three, four, five, six, seven,});
+    }
+
+    @Benchmark
+    @BenchmarkMode(Mode.Throughput)
+    @OutputTimeUnit(TimeUnit.SECONDS)
+    public void throughput8Params() {
+        logger.logp(java.util.logging.Level.INFO, getClass().getName(), "methodName",
+                "p1={}, p2={}, p3={}, p4={}, p5={}, p6={}, p7={}, p8={}",
+                new Object[]{one, two, three, four, five, six, seven, eight,});
+    }
+
+    @Benchmark
+    @BenchmarkMode(Mode.Throughput)
+    @OutputTimeUnit(TimeUnit.SECONDS)
+    public void throughput9Params() {
+        logger.logp(java.util.logging.Level.INFO, getClass().getName(), "methodName",
+                "p1={}, p2={}, p3={}, p4={}, p5={}, p6={}, p7={}, p8={}, p9={}",
+                new Object[]{one, two, three, four, five, six, seven, eight, nine,});
+    }
+
+    @Benchmark
+    @BenchmarkMode(Mode.Throughput)
+    @OutputTimeUnit(TimeUnit.SECONDS)
+    public void throughput10Params() {
+        logger.logp(java.util.logging.Level.INFO, getClass().getName(), "methodName",
+                "p1={}, p2={}, p3={}, p4={}, p5={}, p6={}, p7={}, p8={}, p9={}, p10={}",
+                new Object[]{one, two, three, four, five, six, seven, eight, nine, ten});
+    }
+
+    @Benchmark
+    @BenchmarkMode(Mode.Throughput)
+    @OutputTimeUnit(TimeUnit.SECONDS)
+    public void throughput11Params() {
+        logger.logp(java.util.logging.Level.INFO, getClass().getName(), "methodName",
+                "p1={}, p2={}, p3={}, p4={}, p5={}, p6={}, p7={}, p8={}, p9={}, p10={}, p11={}",
+                new Object[]{one, two, three, four, five, six, seven, eight, nine, ten, eleven});
+    }
+}

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/990d071d/log4j-perf/src/main/java/org/apache/logging/log4j/perf/util/BenchmarkMessageParams.java
----------------------------------------------------------------------
diff --git a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/util/BenchmarkMessageParams.java b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/util/BenchmarkMessageParams.java
new file mode 100644
index 0000000..a769c25
--- /dev/null
+++ b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/util/BenchmarkMessageParams.java
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache license, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the license for the specific language governing permissions and
+ * limitations under the license.
+ */
+package org.apache.logging.log4j.perf.util;
+
+import java.util.Arrays;
+
+/**
+ * Created by remko on 5/5/2016.
+ */
+public class BenchmarkMessageParams {
+    final static char[] CHARS = new char[16];
+    static {
+        Arrays.fill(CHARS, 'a');
+    }
+    public final static String TEST = new String(CHARS);
+
+    public static volatile String one = "1";
+    public static volatile String two = "2";
+    public static volatile String three = "3";
+    public static volatile String four = "4";
+    public static volatile String five = "5";
+    public static volatile String six = "6";
+    public static volatile String seven = "7";
+    public static volatile String eight = "8";
+    public static volatile String nine = "9";
+    public static volatile String ten = "10";
+    public static volatile String eleven = "11";
+}

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/990d071d/log4j-perf/src/main/java/org/apache/logging/log4j/perf/util/NoOpJULHandler.java
----------------------------------------------------------------------
diff --git a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/util/NoOpJULHandler.java b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/util/NoOpJULHandler.java
new file mode 100644
index 0000000..1bc7890
--- /dev/null
+++ b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/util/NoOpJULHandler.java
@@ -0,0 +1,41 @@
+/*
+ * 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.logging.log4j.perf.util;
+
+import java.util.concurrent.atomic.AtomicLong;
+import java.util.logging.Handler;
+import java.util.logging.LogRecord;
+
+/**
+ * JUL (java.util.logging) no-op handler..
+ */
+public class NoOpJULHandler extends Handler {
+    public AtomicLong count = new AtomicLong();
+
+    @Override
+    public void publish(final LogRecord record) {
+        count.incrementAndGet();
+    }
+
+    @Override
+    public void flush() {
+    }
+
+    @Override
+    public void close() throws SecurityException {
+    }
+}

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/990d071d/log4j-perf/src/main/java/org/apache/logging/log4j/perf/util/NoOpLog4jAppender.java
----------------------------------------------------------------------
diff --git a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/util/NoOpLog4jAppender.java b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/util/NoOpLog4jAppender.java
new file mode 100644
index 0000000..a72d96a
--- /dev/null
+++ b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/util/NoOpLog4jAppender.java
@@ -0,0 +1,44 @@
+/*
+ * 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.logging.log4j.perf.util;
+
+import java.util.concurrent.atomic.AtomicLong;
+
+import org.apache.log4j.AppenderSkeleton;
+import org.apache.log4j.spi.LoggingEvent;
+
+/**
+ * Log4j 1.2 no-op appender.
+ */
+public class NoOpLog4jAppender extends AppenderSkeleton {
+    public AtomicLong count = new AtomicLong();
+
+    @Override
+    protected void append(final LoggingEvent loggingEvent) {
+        count.incrementAndGet();
+    }
+
+    @Override
+    public void close() {
+
+    }
+
+    @Override
+    public boolean requiresLayout() {
+        return false;
+    }
+}

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/990d071d/log4j-perf/src/main/java/org/apache/logging/log4j/perf/util/NoOpLogbackAppender.java
----------------------------------------------------------------------
diff --git a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/util/NoOpLogbackAppender.java b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/util/NoOpLogbackAppender.java
new file mode 100644
index 0000000..d2dbae3
--- /dev/null
+++ b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/util/NoOpLogbackAppender.java
@@ -0,0 +1,33 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache license, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the license for the specific language governing permissions and
+ * limitations under the license.
+ */
+package org.apache.logging.log4j.perf.util;
+
+import java.util.concurrent.atomic.AtomicLong;
+
+import ch.qos.logback.core.AppenderBase;
+
+/**
+ * Logback no-op appender.
+ */
+public class NoOpLogbackAppender extends AppenderBase {
+    public AtomicLong count = new AtomicLong();
+
+    @Override
+    protected void append(final Object o) {
+        count.incrementAndGet();
+    }
+}

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/990d071d/log4j-perf/src/main/resources/perf-log4j12-async-noOpAppender.xml
----------------------------------------------------------------------
diff --git a/log4j-perf/src/main/resources/perf-log4j12-async-noOpAppender.xml b/log4j-perf/src/main/resources/perf-log4j12-async-noOpAppender.xml
new file mode 100644
index 0000000..c1ca476
--- /dev/null
+++ b/log4j-perf/src/main/resources/perf-log4j12-async-noOpAppender.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--
+  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.
+  -->
+<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
+<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
+    <appender name="NoOp" class="org.apache.logging.log4j.perf.util.NoOpLog4jAppender">
+     </appender>
+     <appender name="ASYNC" class="org.apache.log4j.AsyncAppender">
+         <param name="BufferSize" value="262144"/>
+         <appender-ref ref="NoOp"/>
+     </appender>
+  <root>
+    <priority value="debug" />
+    <appender-ref ref="ASYNC" />
+  </root>
+</log4j:configuration>

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/990d071d/log4j-perf/src/main/resources/perf-logback-async-noOpAppender.xml
----------------------------------------------------------------------
diff --git a/log4j-perf/src/main/resources/perf-logback-async-noOpAppender.xml b/log4j-perf/src/main/resources/perf-logback-async-noOpAppender.xml
new file mode 100644
index 0000000..522f689
--- /dev/null
+++ b/log4j-perf/src/main/resources/perf-logback-async-noOpAppender.xml
@@ -0,0 +1,31 @@
+<!--
+  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.
+  -->
+<configuration>
+
+  <appender name="NoOp" class="org.apache.logging.log4j.perf.util.NoOpLogbackAppender">
+  </appender>
+  <appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
+    <queueSize>262144</queueSize>
+    <discardingThreshold>0</discardingThreshold>
+    <includeCallerData>false</includeCallerData>
+    <appender-ref ref="NoOp" />
+  </appender>
+
+  <root level="debug">
+    <appender-ref ref="ASYNC" />
+  </root>
+</configuration>

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/990d071d/log4j-perf/src/main/resources/perf5AsyncApndNoLoc-noOpAppender.xml
----------------------------------------------------------------------
diff --git a/log4j-perf/src/main/resources/perf5AsyncApndNoLoc-noOpAppender.xml b/log4j-perf/src/main/resources/perf5AsyncApndNoLoc-noOpAppender.xml
new file mode 100644
index 0000000..a183691
--- /dev/null
+++ b/log4j-perf/src/main/resources/perf5AsyncApndNoLoc-noOpAppender.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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.
+  -->
+<Configuration status="OFF">
+  <Appenders>
+    <CountingNoOp name="NoOp">
+    </CountingNoOp>
+    <Async name="Async"  blocking="true" bufferSize="262144">
+      <appender-ref ref="NoOp"/>
+    </Async>
+  </Appenders>
+  <Loggers>
+    <Root level="info" includeLocation="false">
+      <appender-ref ref="Async"/>
+    </Root>
+  </Loggers>
+</Configuration>