You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by rp...@apache.org on 2015/08/09 16:53:41 UTC

[1/2] logging-log4j2 git commit: LOG4J2-599 log4j lambda support - Renamed LambdaLogger to Logger2 - Renamed ExtendedLambdaLogger to ExtendedLogger2 - Renamed LogManager#getLambdaLogger methods to #getLogger2 - Introduced custom functional interface Supp

Repository: logging-log4j2
Updated Branches:
  refs/heads/LOG4J2-599-LambdaSupport 63a325d97 -> 12be6d867


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/12be6d86/log4j-api/src/main/java/org/apache/logging/log4j/spi/AbstractLogger.java
----------------------------------------------------------------------
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/spi/AbstractLogger.java b/log4j-api/src/main/java/org/apache/logging/log4j/spi/AbstractLogger.java
index 95696af..641e36b 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/spi/AbstractLogger.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/spi/AbstractLogger.java
@@ -17,7 +17,6 @@
 package org.apache.logging.log4j.spi;
 
 import java.io.Serializable;
-import java.util.concurrent.Callable;
 
 import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.Marker;
@@ -28,11 +27,13 @@ import org.apache.logging.log4j.message.ParameterizedMessageFactory;
 import org.apache.logging.log4j.message.StringFormattedMessage;
 import org.apache.logging.log4j.status.StatusLogger;
 import org.apache.logging.log4j.util.LambdaUtil;
+import org.apache.logging.log4j.util.MessageSupplier;
+import org.apache.logging.log4j.util.Supplier;
 
 /**
  * Base implementation of a Logger. It is highly recommended that any Logger implementation extend this class.
  */
-public abstract class AbstractLogger implements ExtendedLambdaLogger, Serializable {
+public abstract class AbstractLogger implements ExtendedLogger2, Serializable {
 
     private static final long serialVersionUID = 2L;
 
@@ -245,36 +246,56 @@ public abstract class AbstractLogger implements ExtendedLambdaLogger, Serializab
     }
 
     @Override
-    public void debug(final Callable<?> msgSupplier) {
+    public void debug(final Supplier<?> msgSupplier) {
         logIfEnabled(FQCN, Level.DEBUG, null, msgSupplier, (Throwable) null);
     }
 
     @Override
-    public void debug(final Callable<?> msgSupplier, final Throwable t) {
+    public void debug(final Supplier<?> msgSupplier, final Throwable t) {
         logIfEnabled(FQCN, Level.DEBUG, null, msgSupplier, t);
     }
 
     @Override
-    public void debug(final Marker marker, final Callable<?> msgSupplier) {
+    public void debug(final Marker marker, final Supplier<?> msgSupplier) {
         logIfEnabled(FQCN, Level.DEBUG, marker, msgSupplier, (Throwable) null);
     }
 
     @Override
-    public void debug(final Marker marker, final String message, final Callable<?>... paramSuppliers) {
+    public void debug(final Marker marker, final String message, final Supplier<?>... paramSuppliers) {
         logIfEnabled(FQCN, Level.DEBUG, marker, message, paramSuppliers);
     }
 
     @Override
-    public void debug(final Marker marker, final Callable<?> msgSupplier, final Throwable t) {
+    public void debug(final Marker marker, final Supplier<?> msgSupplier, final Throwable t) {
         logIfEnabled(FQCN, Level.DEBUG, marker, msgSupplier, t);
     }
 
     @Override
-    public void debug(final String message, final Callable<?>... paramSuppliers) {
+    public void debug(final String message, final Supplier<?>... paramSuppliers) {
         logIfEnabled(FQCN, Level.DEBUG, null, message, paramSuppliers);
     }
 
     @Override
+    public void debug(final Marker marker, final MessageSupplier msgSupplier) {
+        logIfEnabled(FQCN, Level.DEBUG, marker, msgSupplier, (Throwable) null);
+    }
+
+    @Override
+    public void debug(final Marker marker, final MessageSupplier msgSupplier, final Throwable t) {
+        logIfEnabled(FQCN, Level.DEBUG, marker, msgSupplier, t);
+    }
+
+    @Override
+    public void debug(final MessageSupplier msgSupplier) {
+        logIfEnabled(FQCN, Level.DEBUG, null, msgSupplier, (Throwable) null);
+    }
+
+    @Override
+    public void debug(final MessageSupplier msgSupplier, final Throwable t) {
+        logIfEnabled(FQCN, Level.DEBUG, null, msgSupplier, t);
+    }
+
+    @Override
     public void entry() {
         entry(FQCN);
     }
@@ -387,36 +408,56 @@ public abstract class AbstractLogger implements ExtendedLambdaLogger, Serializab
     }
 
     @Override
-    public void error(final Callable<?> msgSupplier) {
+    public void error(final Supplier<?> msgSupplier) {
         logIfEnabled(FQCN, Level.ERROR, null, msgSupplier, (Throwable) null);
     }
 
     @Override
-    public void error(final Callable<?> msgSupplier, final Throwable t) {
+    public void error(final Supplier<?> msgSupplier, final Throwable t) {
         logIfEnabled(FQCN, Level.ERROR, null, msgSupplier, t);
     }
 
     @Override
-    public void error(final Marker marker, final Callable<?> msgSupplier) {
+    public void error(final Marker marker, final Supplier<?> msgSupplier) {
         logIfEnabled(FQCN, Level.ERROR, marker, msgSupplier, (Throwable) null);
     }
 
     @Override
-    public void error(final Marker marker, final String message, final Callable<?>... paramSuppliers) {
+    public void error(final Marker marker, final String message, final Supplier<?>... paramSuppliers) {
         logIfEnabled(FQCN, Level.ERROR, marker, message, paramSuppliers);
     }
 
     @Override
-    public void error(final Marker marker, final Callable<?> msgSupplier, final Throwable t) {
+    public void error(final Marker marker, final Supplier<?> msgSupplier, final Throwable t) {
         logIfEnabled(FQCN, Level.ERROR, marker, msgSupplier, t);
     }
 
     @Override
-    public void error(final String message, final Callable<?>... paramSuppliers) {
+    public void error(final String message, final Supplier<?>... paramSuppliers) {
         logIfEnabled(FQCN, Level.ERROR, null, message, paramSuppliers);
     }
 
     @Override
+    public void error(final Marker marker, final MessageSupplier msgSupplier) {
+        logIfEnabled(FQCN, Level.ERROR, marker, msgSupplier, (Throwable) null);
+    }
+
+    @Override
+    public void error(final Marker marker, final MessageSupplier msgSupplier, final Throwable t) {
+        logIfEnabled(FQCN, Level.ERROR, marker, msgSupplier, t);
+    }
+
+    @Override
+    public void error(final MessageSupplier msgSupplier) {
+        logIfEnabled(FQCN, Level.ERROR, null, msgSupplier, (Throwable) null);
+    }
+
+    @Override
+    public void error(final MessageSupplier msgSupplier, final Throwable t) {
+        logIfEnabled(FQCN, Level.ERROR, null, msgSupplier, t);
+    }
+
+    @Override
     public void exit() {
         exit(FQCN, null);
     }
@@ -519,36 +560,56 @@ public abstract class AbstractLogger implements ExtendedLambdaLogger, Serializab
     }
 
     @Override
-    public void fatal(final Callable<?> msgSupplier) {
+    public void fatal(final Supplier<?> msgSupplier) {
         logIfEnabled(FQCN, Level.FATAL, null, msgSupplier, (Throwable) null);
     }
 
     @Override
-    public void fatal(final Callable<?> msgSupplier, final Throwable t) {
+    public void fatal(final Supplier<?> msgSupplier, final Throwable t) {
         logIfEnabled(FQCN, Level.FATAL, null, msgSupplier, t);
     }
 
     @Override
-    public void fatal(final Marker marker, final Callable<?> msgSupplier) {
+    public void fatal(final Marker marker, final Supplier<?> msgSupplier) {
         logIfEnabled(FQCN, Level.FATAL, marker, msgSupplier, (Throwable) null);
     }
 
     @Override
-    public void fatal(final Marker marker, final String message, final Callable<?>... paramSuppliers) {
+    public void fatal(final Marker marker, final String message, final Supplier<?>... paramSuppliers) {
         logIfEnabled(FQCN, Level.FATAL, marker, message, paramSuppliers);
     }
 
     @Override
-    public void fatal(final Marker marker, final Callable<?> msgSupplier, final Throwable t) {
+    public void fatal(final Marker marker, final Supplier<?> msgSupplier, final Throwable t) {
         logIfEnabled(FQCN, Level.FATAL, marker, msgSupplier, t);
     }
 
     @Override
-    public void fatal(final String message, final Callable<?>... paramSuppliers) {
+    public void fatal(final String message, final Supplier<?>... paramSuppliers) {
         logIfEnabled(FQCN, Level.FATAL, null, message, paramSuppliers);
     }
 
     @Override
+    public void fatal(final Marker marker, final MessageSupplier msgSupplier) {
+        logIfEnabled(FQCN, Level.FATAL, marker, msgSupplier, (Throwable) null);
+    }
+
+    @Override
+    public void fatal(final Marker marker, final MessageSupplier msgSupplier, final Throwable t) {
+        logIfEnabled(FQCN, Level.FATAL, marker, msgSupplier, t);
+    }
+
+    @Override
+    public void fatal(final MessageSupplier msgSupplier) {
+        logIfEnabled(FQCN, Level.FATAL, null, msgSupplier, (Throwable) null);
+    }
+
+    @Override
+    public void fatal(final MessageSupplier msgSupplier, final Throwable t) {
+        logIfEnabled(FQCN, Level.FATAL, null, msgSupplier, t);
+    }
+
+    @Override
     public MessageFactory getMessageFactory() {
         return messageFactory;
     }
@@ -629,36 +690,56 @@ public abstract class AbstractLogger implements ExtendedLambdaLogger, Serializab
     }
 
     @Override
-    public void info(final Callable<?> msgSupplier) {
+    public void info(final Supplier<?> msgSupplier) {
         logIfEnabled(FQCN, Level.INFO, null, msgSupplier, (Throwable) null);
     }
 
     @Override
-    public void info(final Callable<?> msgSupplier, final Throwable t) {
+    public void info(final Supplier<?> msgSupplier, final Throwable t) {
         logIfEnabled(FQCN, Level.INFO, null, msgSupplier, t);
     }
 
     @Override
-    public void info(final Marker marker, final Callable<?> msgSupplier) {
+    public void info(final Marker marker, final Supplier<?> msgSupplier) {
         logIfEnabled(FQCN, Level.INFO, marker, msgSupplier, (Throwable) null);
     }
 
     @Override
-    public void info(final Marker marker, final String message, final Callable<?>... paramSuppliers) {
+    public void info(final Marker marker, final String message, final Supplier<?>... paramSuppliers) {
         logIfEnabled(FQCN, Level.INFO, marker, message, paramSuppliers);
     }
 
     @Override
-    public void info(final Marker marker, final Callable<?> msgSupplier, final Throwable t) {
+    public void info(final Marker marker, final Supplier<?> msgSupplier, final Throwable t) {
         logIfEnabled(FQCN, Level.INFO, marker, msgSupplier, t);
     }
 
     @Override
-    public void info(final String message, final Callable<?>... paramSuppliers) {
+    public void info(final String message, final Supplier<?>... paramSuppliers) {
         logIfEnabled(FQCN, Level.INFO, null, message, paramSuppliers);
     }
 
     @Override
+    public void info(final Marker marker, final MessageSupplier msgSupplier) {
+        logIfEnabled(FQCN, Level.INFO, marker, msgSupplier, (Throwable) null);
+    }
+
+    @Override
+    public void info(final Marker marker, final MessageSupplier msgSupplier, final Throwable t) {
+        logIfEnabled(FQCN, Level.INFO, marker, msgSupplier, t);
+    }
+
+    @Override
+    public void info(final MessageSupplier msgSupplier) {
+        logIfEnabled(FQCN, Level.INFO, null, msgSupplier, (Throwable) null);
+    }
+
+    @Override
+    public void info(final MessageSupplier msgSupplier, final Throwable t) {
+        logIfEnabled(FQCN, Level.INFO, null, msgSupplier, t);
+    }
+
+    @Override
     public boolean isDebugEnabled() {
         return isEnabled(Level.DEBUG, null, null);
     }
@@ -801,36 +882,56 @@ public abstract class AbstractLogger implements ExtendedLambdaLogger, Serializab
     }
 
     @Override
-    public void log(final Level level, final Callable<?> msgSupplier) {
+    public void log(final Level level, final Supplier<?> msgSupplier) {
         logIfEnabled(FQCN, level, null, msgSupplier, (Throwable) null);
     }
 
     @Override
-    public void log(final Level level, final Callable<?> msgSupplier, final Throwable t) {
+    public void log(final Level level, final Supplier<?> msgSupplier, final Throwable t) {
         logIfEnabled(FQCN, level, null, msgSupplier, t);
     }
 
     @Override
-    public void log(final Level level, final Marker marker, final Callable<?> msgSupplier) {
+    public void log(final Level level, final Marker marker, final Supplier<?> msgSupplier) {
         logIfEnabled(FQCN, level, marker, msgSupplier, (Throwable) null);
     }
 
     @Override
-    public void log(final Level level, final Marker marker, final String message, final Callable<?>... paramSuppliers) {
+    public void log(final Level level, final Marker marker, final String message, final Supplier<?>... paramSuppliers) {
         logIfEnabled(FQCN, level, marker, message, paramSuppliers);
     }
 
     @Override
-    public void log(final Level level, final Marker marker, final Callable<?> msgSupplier, final Throwable t) {
+    public void log(final Level level, final Marker marker, final Supplier<?> msgSupplier, final Throwable t) {
         logIfEnabled(FQCN, level, marker, msgSupplier, t);
     }
 
     @Override
-    public void log(final Level level, final String message, final Callable<?>... paramSuppliers) {
+    public void log(final Level level, final String message, final Supplier<?>... paramSuppliers) {
         logIfEnabled(FQCN, level, null, message, paramSuppliers);
     }
 
     @Override
+    public void log(final Level level, final Marker marker, final MessageSupplier msgSupplier) {
+        logIfEnabled(FQCN, level, marker, msgSupplier, (Throwable) null);
+    }
+
+    @Override
+    public void log(final Level level, final Marker marker, final MessageSupplier msgSupplier, final Throwable t) {
+        logIfEnabled(FQCN, level, marker, msgSupplier, t);
+    }
+
+    @Override
+    public void log(final Level level, final MessageSupplier msgSupplier) {
+        logIfEnabled(FQCN, level, null, msgSupplier, (Throwable) null);
+    }
+
+    @Override
+    public void log(final Level level, final MessageSupplier msgSupplier, final Throwable t) {
+        logIfEnabled(FQCN, level, null, msgSupplier, t);
+    }
+
+    @Override
     public void logIfEnabled(final String fqcn, final Level level, final Marker marker, final Message msg,
             final Throwable t) {
         if (isEnabled(level, marker, msg, t)) {
@@ -839,6 +940,14 @@ public abstract class AbstractLogger implements ExtendedLambdaLogger, Serializab
     }
 
     @Override
+    public void logIfEnabled(final String fqcn, final Level level, final Marker marker, 
+            final MessageSupplier msgSupplier, final Throwable t) {
+        if (isEnabled(level, marker, msgSupplier, t)) {
+            logMessage(fqcn, level, marker, msgSupplier, t);
+        }
+    }
+
+    @Override
     public void logIfEnabled(final String fqcn, final Level level, final Marker marker, final Object message,
             final Throwable t) {
         if (isEnabled(level, marker, message, t)) {
@@ -847,7 +956,7 @@ public abstract class AbstractLogger implements ExtendedLambdaLogger, Serializab
     }
 
     @Override
-    public void logIfEnabled(final String fqcn, final Level level, final Marker marker, final Callable<?> msgSupplier,
+    public void logIfEnabled(final String fqcn, final Level level, final Marker marker, final Supplier<?> msgSupplier,
             final Throwable t) {
         if (isEnabled(level, marker, msgSupplier, t)) {
             logMessage(fqcn, level, marker, msgSupplier, t);
@@ -863,7 +972,7 @@ public abstract class AbstractLogger implements ExtendedLambdaLogger, Serializab
 
     @Override
     public void logIfEnabled(final String fqcn, final Level level, final Marker marker, final String message,
-            final Callable<?>... paramSuppliers) {
+            final Supplier<?>... paramSuppliers) {
         if (isEnabled(level, marker, message)) {
             logMessage(fqcn, level, marker, message, paramSuppliers);
         }
@@ -890,9 +999,15 @@ public abstract class AbstractLogger implements ExtendedLambdaLogger, Serializab
         logMessage(fqcn, level, marker, messageFactory.newMessage(message), t);
     }
 
-    protected void logMessage(final String fqcn, final Level level, final Marker marker, final Callable<?> msgSupplier,
+    protected void logMessage(final String fqcn, final Level level, final Marker marker,
+            final MessageSupplier msgSupplier, final Throwable t) {
+        Message message = LambdaUtil.get(msgSupplier);
+        logMessage(fqcn, level, marker, message, t);
+    }
+
+    protected void logMessage(final String fqcn, final Level level, final Marker marker, final Supplier<?> msgSupplier,
             final Throwable t) {
-        Object message = LambdaUtil.call(msgSupplier);
+        Object message = LambdaUtil.get(msgSupplier);
         logMessage(fqcn, level, marker, messageFactory.newMessage(message), t);
     }
 
@@ -913,8 +1028,8 @@ public abstract class AbstractLogger implements ExtendedLambdaLogger, Serializab
     }
 
     protected void logMessage(final String fqcn, final Level level, final Marker marker, final String message,
-            final Callable<?>... paramSuppliers) {
-        final Message msg = messageFactory.newMessage(message, LambdaUtil.callAll(paramSuppliers));
+            final Supplier<?>... paramSuppliers) {
+        final Message msg = messageFactory.newMessage(message, LambdaUtil.getAll(paramSuppliers));
         logMessage(fqcn, level, marker, msg, msg.getThrowable());
     }
 
@@ -1035,41 +1150,61 @@ public abstract class AbstractLogger implements ExtendedLambdaLogger, Serializab
     }
 
     @Override
-    public void warn(final Marker marker, final Message msg) {
-        logIfEnabled(FQCN, Level.WARN, marker, msg, null);
-    }
-
-    @Override
-    public void trace(final Callable<?> msgSupplier) {
+    public void trace(final Supplier<?> msgSupplier) {
         logIfEnabled(FQCN, Level.TRACE, null, msgSupplier, (Throwable) null);
     }
 
     @Override
-    public void trace(final Callable<?> msgSupplier, final Throwable t) {
+    public void trace(final Supplier<?> msgSupplier, final Throwable t) {
         logIfEnabled(FQCN, Level.TRACE, null, msgSupplier, t);
     }
 
     @Override
-    public void trace(final Marker marker, final Callable<?> msgSupplier) {
+    public void trace(final Marker marker, final Supplier<?> msgSupplier) {
         logIfEnabled(FQCN, Level.TRACE, marker, msgSupplier, (Throwable) null);
     }
 
     @Override
-    public void trace(final Marker marker, final String message, final Callable<?>... paramSuppliers) {
+    public void trace(final Marker marker, final String message, final Supplier<?>... paramSuppliers) {
         logIfEnabled(FQCN, Level.TRACE, marker, message, paramSuppliers);
     }
 
     @Override
-    public void trace(final Marker marker, final Callable<?> msgSupplier, final Throwable t) {
+    public void trace(final Marker marker, final Supplier<?> msgSupplier, final Throwable t) {
         logIfEnabled(FQCN, Level.TRACE, marker, msgSupplier, t);
     }
 
     @Override
-    public void trace(final String message, final Callable<?>... paramSuppliers) {
+    public void trace(final String message, final Supplier<?>... paramSuppliers) {
         logIfEnabled(FQCN, Level.TRACE, null, message, paramSuppliers);
     }
 
     @Override
+    public void trace(final Marker marker, final MessageSupplier msgSupplier) {
+        logIfEnabled(FQCN, Level.TRACE, marker, msgSupplier, (Throwable) null);
+    }
+
+    @Override
+    public void trace(final Marker marker, final MessageSupplier msgSupplier, final Throwable t) {
+        logIfEnabled(FQCN, Level.TRACE, marker, msgSupplier, t);
+    }
+
+    @Override
+    public void trace(final MessageSupplier msgSupplier) {
+        logIfEnabled(FQCN, Level.TRACE, null, msgSupplier, (Throwable) null);
+    }
+
+    @Override
+    public void trace(final MessageSupplier msgSupplier, final Throwable t) {
+        logIfEnabled(FQCN, Level.TRACE, null, msgSupplier, t);
+    }
+
+    @Override
+    public void warn(final Marker marker, final Message msg) {
+        logIfEnabled(FQCN, Level.WARN, marker, msg, null);
+    }
+
+    @Override
     public void warn(final Marker marker, final Message msg, final Throwable t) {
         logIfEnabled(FQCN, Level.WARN, marker, msg, t);
     }
@@ -1079,11 +1214,6 @@ public abstract class AbstractLogger implements ExtendedLambdaLogger, Serializab
         logIfEnabled(FQCN, Level.WARN, marker, message, null);
     }
 
-    /* -- FIXME: this comment looks lost
-     * Instead of one single method with Object... declared the following methods explicitly specify parameters because
-     * they perform dramatically better than having the JVM convert them to an array.
-     */
-
     @Override
     public void warn(final Marker marker, final Object message, final Throwable t) {
         logIfEnabled(FQCN, Level.WARN, marker, message, t);
@@ -1140,32 +1270,52 @@ public abstract class AbstractLogger implements ExtendedLambdaLogger, Serializab
     }
 
     @Override
-    public void warn(final Callable<?> msgSupplier) {
+    public void warn(final Supplier<?> msgSupplier) {
         logIfEnabled(FQCN, Level.WARN, null, msgSupplier, (Throwable) null);
     }
 
     @Override
-    public void warn(final Callable<?> msgSupplier, final Throwable t) {
+    public void warn(final Supplier<?> msgSupplier, final Throwable t) {
         logIfEnabled(FQCN, Level.WARN, null, msgSupplier, t);
     }
 
     @Override
-    public void warn(final Marker marker, final Callable<?> msgSupplier) {
+    public void warn(final Marker marker, final Supplier<?> msgSupplier) {
         logIfEnabled(FQCN, Level.WARN, marker, msgSupplier, (Throwable) null);
     }
 
     @Override
-    public void warn(final Marker marker, final String message, final Callable<?>... paramSuppliers) {
+    public void warn(final Marker marker, final String message, final Supplier<?>... paramSuppliers) {
         logIfEnabled(FQCN, Level.WARN, marker, message, paramSuppliers);
     }
 
     @Override
-    public void warn(final Marker marker, final Callable<?> msgSupplier, final Throwable t) {
+    public void warn(final Marker marker, final Supplier<?> msgSupplier, final Throwable t) {
         logIfEnabled(FQCN, Level.WARN, marker, msgSupplier, t);
     }
 
     @Override
-    public void warn(final String message, final Callable<?>... paramSuppliers) {
+    public void warn(final String message, final Supplier<?>... paramSuppliers) {
         logIfEnabled(FQCN, Level.WARN, null, message, paramSuppliers);
     }
+
+    @Override
+    public void warn(final Marker marker, final MessageSupplier msgSupplier) {
+        logIfEnabled(FQCN, Level.WARN, marker, msgSupplier, (Throwable) null);
+    }
+
+    @Override
+    public void warn(final Marker marker, final MessageSupplier msgSupplier, final Throwable t) {
+        logIfEnabled(FQCN, Level.WARN, marker, msgSupplier, t);
+    }
+
+    @Override
+    public void warn(final MessageSupplier msgSupplier) {
+        logIfEnabled(FQCN, Level.WARN, null, msgSupplier, (Throwable) null);
+    }
+
+    @Override
+    public void warn(final MessageSupplier msgSupplier, final Throwable t) {
+        logIfEnabled(FQCN, Level.WARN, null, msgSupplier, t);
+    }
 }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/12be6d86/log4j-api/src/main/java/org/apache/logging/log4j/spi/ExtendedLambdaLogger.java
----------------------------------------------------------------------
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/spi/ExtendedLambdaLogger.java b/log4j-api/src/main/java/org/apache/logging/log4j/spi/ExtendedLambdaLogger.java
deleted file mode 100644
index 5e61f62..0000000
--- a/log4j-api/src/main/java/org/apache/logging/log4j/spi/ExtendedLambdaLogger.java
+++ /dev/null
@@ -1,56 +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.spi;
-
-import java.util.concurrent.Callable;
-
-import org.apache.logging.log4j.LambdaLogger;
-import org.apache.logging.log4j.Level;
-import org.apache.logging.log4j.Marker;
-
-/**
- * Extends the {@code LambdaLogger} interface with methods that facilitate implementing or extending
- * {@code LambdaLogger}s. Users should not need to use this interface.
- */
-public interface ExtendedLambdaLogger extends ExtendedLogger, LambdaLogger {
-
-    /**
-     * Logs a message whose parameters are only to be constructed if the specified level is active.
-     * 
-     * @param fqcn The fully qualified class name of the logger entry point, used to determine the caller class and
-     *            method when location information needs to be logged.
-     * @param level The logging Level to check.
-     * @param marker A Marker or null.
-     * @param message The message format.
-     * @param paramSuppliers An array of functions, which when called, produce the desired log message parameters.
-     */
-    void logIfEnabled(String fqcn, Level level, Marker marker, String message, Callable<?>... paramSuppliers);
-
-    /**
-     * Logs a message which is only to be constructed if the specified level is active.
-     * 
-     * @param fqcn The fully qualified class name of the logger entry point, used to determine the caller class and
-     *            method when location information needs to be logged.
-     * @param level The logging Level to check.
-     * @param marker A Marker or null.
-     * @param msgSupplier A function, which when called, produces the desired log message.
-     * @param t the exception to log, including its stack trace.
-     */
-    void logIfEnabled(String fqcn, Level level, Marker marker, Callable<?> msgSupplier, Throwable t);
-
-}

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/12be6d86/log4j-api/src/main/java/org/apache/logging/log4j/spi/ExtendedLogger2.java
----------------------------------------------------------------------
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/spi/ExtendedLogger2.java b/log4j-api/src/main/java/org/apache/logging/log4j/spi/ExtendedLogger2.java
new file mode 100644
index 0000000..85ce529
--- /dev/null
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/spi/ExtendedLogger2.java
@@ -0,0 +1,68 @@
+/*
+ * 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.spi;
+
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.Logger2;
+import org.apache.logging.log4j.Marker;
+import org.apache.logging.log4j.util.MessageSupplier;
+import org.apache.logging.log4j.util.Supplier;
+
+/**
+ * Extends the {@code Logger2} interface with methods that facilitate implementing or extending
+ * {@code Logger2}s. Users should not need to use this interface.
+ */
+public interface ExtendedLogger2 extends ExtendedLogger, Logger2 {
+
+    /**
+     * Logs a message which is only to be constructed if the specified level is active.
+     * 
+     * @param fqcn The fully qualified class name of the logger entry point, used to determine the caller class and
+     *            method when location information needs to be logged.
+     * @param level The logging Level to check.
+     * @param marker A Marker or null.
+     * @param msgSupplier A function, which when called, produces the desired log message.
+     * @param t the exception to log, including its stack trace.
+     */
+    void logIfEnabled(String fqcn, Level level, Marker marker, MessageSupplier msgSupplier, Throwable t);
+
+    /**
+     * Logs a message whose parameters are only to be constructed if the specified level is active.
+     * 
+     * @param fqcn The fully qualified class name of the logger entry point, used to determine the caller class and
+     *            method when location information needs to be logged.
+     * @param level The logging Level to check.
+     * @param marker A Marker or null.
+     * @param message The message format.
+     * @param paramSuppliers An array of functions, which when called, produce the desired log message parameters.
+     */
+    void logIfEnabled(String fqcn, Level level, Marker marker, String message, Supplier<?>... paramSuppliers);
+
+    /**
+     * Logs a message which is only to be constructed if the specified level is active.
+     * 
+     * @param fqcn The fully qualified class name of the logger entry point, used to determine the caller class and
+     *            method when location information needs to be logged.
+     * @param level The logging Level to check.
+     * @param marker A Marker or null.
+     * @param msgSupplier A function, which when called, produces the desired log message.
+     * @param t the exception to log, including its stack trace.
+     */
+    void logIfEnabled(String fqcn, Level level, Marker marker, Supplier<?> msgSupplier, Throwable t);
+
+}

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/12be6d86/log4j-api/src/main/java/org/apache/logging/log4j/util/LambdaUtil.java
----------------------------------------------------------------------
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/util/LambdaUtil.java b/log4j-api/src/main/java/org/apache/logging/log4j/util/LambdaUtil.java
index 9ba491b..954886b 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/util/LambdaUtil.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/util/LambdaUtil.java
@@ -17,7 +17,8 @@
 
 package org.apache.logging.log4j.util;
 
-import java.util.concurrent.Callable;
+import org.apache.logging.log4j.message.Message;
+
 
 /**
  * Utility class for lambda support.
@@ -30,13 +31,13 @@ public class LambdaUtil {
      * @return an array containing the results of evaluating the lambda expressions (or {@code null} if the suppliers
      *         array was {@code null}
      */
-    public static Object[] callAll(Callable<?>... suppliers) {
+    public static Object[] getAll(Supplier<?>... suppliers) {
         if (suppliers == null) {
             return (Object[]) null;
         }
         final Object[] result = new Object[suppliers.length];
         for (int i = 0; i < result.length; i++) {
-            result[i] = call(suppliers[i]);
+            result[i] = get(suppliers[i]);
         }
         return result;
     }
@@ -47,16 +48,29 @@ public class LambdaUtil {
      * @return the results of evaluating the lambda expression (or {@code null} if the supplier
      *         was {@code null}
      */
-    public static Object call(Callable<?> supplier) {
+    public static Object get(Supplier<?> supplier) {
         if (supplier == null) {
             return null;
         }
         Object result = null;
         try {
-            result = supplier.call();
+            result = supplier.get();
         } catch (Exception ex) {
             result = ex;
         }
         return result;
     }
+
+    /**
+     * Returns the Message supplied by the specified function.
+     * @param supplier a lambda expression or {@code null}
+     * @return the Message resulting from evaluating the lambda expression (or {@code null} if the supplier was
+     * {@code null}
+     */
+    public static Message get(MessageSupplier supplier) {
+        if (supplier == null) {
+            return null;
+        }
+        return supplier.get();
+    }
 }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/12be6d86/log4j-api/src/main/java/org/apache/logging/log4j/util/MessageSupplier.java
----------------------------------------------------------------------
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/util/MessageSupplier.java b/log4j-api/src/main/java/org/apache/logging/log4j/util/MessageSupplier.java
new file mode 100644
index 0000000..1d268cf
--- /dev/null
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/util/MessageSupplier.java
@@ -0,0 +1,40 @@
+/*
+ * 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.util;
+
+import org.apache.logging.log4j.message.Message;
+
+/**
+ * Classes implementing this interface know how to supply {@link Message}s.
+ *
+ * <p>This is a <a href="https://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html">functional
+ * interface</a> intended to support lambda expressions in log4j 2.
+ *
+ * <p>Implementors are free to cache values or return a new or distinct value each time the supplier is invoked.
+ *
+ * @since log4j-2.4
+ */
+public interface MessageSupplier {
+
+    /**
+     * Gets a Message.
+     *
+     * @return a Message
+     */
+    Message get();
+}

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/12be6d86/log4j-api/src/main/java/org/apache/logging/log4j/util/Supplier.java
----------------------------------------------------------------------
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/util/Supplier.java b/log4j-api/src/main/java/org/apache/logging/log4j/util/Supplier.java
new file mode 100644
index 0000000..51421f3
--- /dev/null
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/util/Supplier.java
@@ -0,0 +1,40 @@
+/*
+ * 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.util;
+
+/**
+ * Classes implementing this interface know how to supply a value.
+ *
+ * <p>This is a <a href="https://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html">functional
+ * interface</a> intended to support lambda expressions in log4j 2.
+ *
+ * <p>Implementors are free to cache values or return a new or distinct value each time the supplier is invoked.
+ *
+ * @param <T> the type of values returned by this supplier
+ *
+ * @since log4j-2.4
+ */
+public interface Supplier<T> {
+
+    /**
+     * Gets a value.
+     *
+     * @return a value
+     */
+    T get();
+}

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/12be6d86/log4j-api/src/test/java/org/apache/logging/log4j/Logger2Test.java
----------------------------------------------------------------------
diff --git a/log4j-api/src/test/java/org/apache/logging/log4j/Logger2Test.java b/log4j-api/src/test/java/org/apache/logging/log4j/Logger2Test.java
new file mode 100644
index 0000000..14dd36b
--- /dev/null
+++ b/log4j-api/src/test/java/org/apache/logging/log4j/Logger2Test.java
@@ -0,0 +1,190 @@
+/*
+ * 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;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.logging.log4j.message.Message;
+import org.apache.logging.log4j.message.SimpleMessage;
+import org.apache.logging.log4j.spi.AbstractLogger;
+import org.apache.logging.log4j.util.MessageSupplier;
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+/**
+ * Tests the AbstractLogger implementation of the Logger2 interface.
+ */
+public class Logger2Test {
+
+    private static class LogEvent {
+        @SuppressWarnings("unused")
+        final String fqcn;
+        @SuppressWarnings("unused")
+        final Level level;
+        final Marker marker;
+        final Message message;
+        final Throwable throwable;
+
+        public LogEvent(String fqcn, Level level, Marker marker, Message message, Throwable t) {
+            this.fqcn = fqcn;
+            this.level = level;
+            this.marker = marker;
+            this.message = message;
+            this.throwable = t;
+        }
+    }
+
+    class Logger2Impl extends AbstractLogger {
+        private static final long serialVersionUID = 1L;
+
+        boolean enabled = true;
+        final List<Logger2Test.LogEvent> list = new ArrayList<Logger2Test.LogEvent>();
+
+        @Override
+        public boolean isEnabled(Level level, Marker marker, Message message, Throwable t) {
+            return enabled;
+        }
+
+        @Override
+        public boolean isEnabled(Level level, Marker marker, Object message, Throwable t) {
+            return enabled;
+        }
+
+        @Override
+        public boolean isEnabled(Level level, Marker marker, String message, Throwable t) {
+            return enabled;
+        }
+
+        @Override
+        public boolean isEnabled(Level level, Marker marker, String message) {
+            return enabled;
+        }
+
+        @Override
+        public boolean isEnabled(Level level, Marker marker, String message, Object... params) {
+            return enabled;
+        }
+
+        @Override
+        public void logMessage(String fqcn, Level level, Marker marker, Message message, Throwable t) {
+            list.add(new LogEvent(fqcn, level, marker, message, t));
+        }
+
+        @Override
+        public Level getLevel() {
+            return null;
+        }
+
+        public AbstractLogger disable() {
+            enabled = false;
+            return this;
+        }
+
+        public AbstractLogger enable() {
+            enabled = true;
+            return this;
+        }
+    }
+
+    final Logger2Impl logger2 = new Logger2Impl();
+    final Message message = new SimpleMessage("HiMessage");
+    final Throwable throwable = new Error("I'm Bad");
+    final Marker marker = MarkerManager.getMarker("test");
+
+    class MyMessageSupplier implements MessageSupplier {
+        public int count = 0;
+
+        @Override
+        public Message get() {
+            count++;
+            return message;
+        }
+    };
+
+    final MyMessageSupplier messageSupplier = new MyMessageSupplier();
+
+    @Before
+    public void beforeEachTest() {
+        logger2.list.clear();
+        messageSupplier.count = 0;
+    }
+
+    @Test
+    public void testDebugMarkerMessageSupplier() {
+        logger2.disable().debug(marker, messageSupplier);
+        assertTrue(logger2.list.isEmpty());
+        assertEquals(0, messageSupplier.count);
+
+        logger2.enable().debug(marker, messageSupplier);
+        assertEquals(1, logger2.list.size());
+        assertEquals(1, messageSupplier.count);
+
+        LogEvent event = logger2.list.get(0);
+        assertSame(message, event.message);
+        assertSame(marker, event.marker);
+    }
+
+    @Test
+    public void testDebugMessageSupplier() {
+        logger2.disable().debug(messageSupplier);
+        assertTrue(logger2.list.isEmpty());
+        assertEquals(0, messageSupplier.count);
+
+        logger2.enable().debug(messageSupplier);
+        assertEquals(1, logger2.list.size());
+        assertEquals(1, messageSupplier.count);
+
+        LogEvent event = logger2.list.get(0);
+        assertSame(message, event.message);
+    }
+
+    @Test
+    public void testDebugMarkerMessageSupplierThrowable() {
+        logger2.disable().debug(marker, messageSupplier, throwable);
+        assertTrue(logger2.list.isEmpty());
+        assertEquals(0, messageSupplier.count);
+
+        logger2.enable().debug(marker, messageSupplier, throwable);
+        assertEquals(1, logger2.list.size());
+        assertEquals(1, messageSupplier.count);
+
+        LogEvent event = logger2.list.get(0);
+        assertSame(marker, event.marker);
+        assertSame(message, event.message);
+        assertSame(throwable, event.throwable);
+    }
+
+    @Test
+    public void testDebugMessageSupplierThrowable() {
+        logger2.disable().debug(messageSupplier, throwable);
+        assertTrue(logger2.list.isEmpty());
+        assertEquals(0, messageSupplier.count);
+
+        logger2.enable().debug(messageSupplier, throwable);
+        assertEquals(1, logger2.list.size());
+        assertEquals(1, messageSupplier.count);
+
+        LogEvent event = logger2.list.get(0);
+        assertSame(message, event.message);
+        assertSame(throwable, event.throwable);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/12be6d86/log4j-api/src/test/java/org/apache/logging/log4j/util/LambdaUtilTest.java
----------------------------------------------------------------------
diff --git a/log4j-api/src/test/java/org/apache/logging/log4j/util/LambdaUtilTest.java b/log4j-api/src/test/java/org/apache/logging/log4j/util/LambdaUtilTest.java
index edfc50e..946c63c 100644
--- a/log4j-api/src/test/java/org/apache/logging/log4j/util/LambdaUtilTest.java
+++ b/log4j-api/src/test/java/org/apache/logging/log4j/util/LambdaUtilTest.java
@@ -17,8 +17,8 @@
 
 package org.apache.logging.log4j.util;
 
-import java.util.concurrent.Callable;
-
+import org.apache.logging.log4j.message.Message;
+import org.apache.logging.log4j.message.SimpleMessage;
 import org.junit.Test;
 
 import static org.junit.Assert.*;
@@ -29,10 +29,21 @@ import static org.junit.Assert.*;
 public class LambdaUtilTest {
 
     @Test
-    public void testCallReturnsResultOfCallable() {
+    public void testGetSupplierResultOfSupplier() {
         final String expected = "result";
-        final Object actual = LambdaUtil.call(new Callable<String>() {
-            public String call() {
+        final Object actual = LambdaUtil.get(new Supplier<String>() {
+            public String get() {
+                return expected;
+            }
+        });
+        assertSame(expected, actual);
+    }
+
+    @Test
+    public void testGetMessageSupplierResultOfSupplier() {
+        final Message expected = new SimpleMessage("hi");
+        final Message actual = LambdaUtil.get(new MessageSupplier() {
+            public Message get() {
                 return expected;
             }
         });
@@ -40,55 +51,71 @@ public class LambdaUtilTest {
     }
 
     @Test
-    public void testCallReturnsNullIfCallableNull() {
-        final Object actual = LambdaUtil.call(null);
+    public void testGetSupplierReturnsNullIfSupplierNull() {
+        final Object actual = LambdaUtil.get((Supplier<?>) null);
+        assertNull(actual);
+    }
+
+    @Test
+    public void testGetMessageSupplierReturnsNullIfSupplierNull() {
+        final Object actual = LambdaUtil.get((MessageSupplier) null);
         assertNull(actual);
     }
 
     @Test
-    public void testCallReturnsExceptionIfCallableThrowsException() {
-        final Exception expected = new RuntimeException();
-        final Object actual = LambdaUtil.call(new Callable<String>() {
-            public String call() throws Exception{
+    public void testGetSupplierExceptionIfSupplierThrowsException() {
+        final RuntimeException expected = new RuntimeException();
+        final Object actual = LambdaUtil.get(new Supplier<String>() {
+            public String get() {
                 throw expected;
             }
         });
         assertSame(expected, actual);
     }
 
+    @Test
+    public void testGetMessageSupplierExceptionIfSupplierThrowsException() {
+        final RuntimeException expected = new RuntimeException();
+        final Object actual = LambdaUtil.get(new MessageSupplier() {
+            public Message get() {
+                throw expected;
+            }
+        });
+        assertSame(expected, actual);
+    }
 
     @Test
-    public void testCallAllReturnsResultOfCallables() {
+    public void testGetAllReturnsResultOfSuppliers() {
         final String expected1 = "result1";
-        Callable<String> function1 = new Callable<String>() {
-            public String call() {
+        Supplier<String> function1 = new Supplier<String>() {
+            public String get() {
                 return expected1;
             }
         };
         final String expected2 = "result2";
-        Callable<String> function2 = new Callable<String>() {
-            public String call() {
+        Supplier<String> function2 = new Supplier<String>() {
+            public String get() {
                 return expected2;
             }
         };
-        
-        Callable<?>[] functions = {function1, function2};
-        final Object[] actual = LambdaUtil.callAll(functions);
+
+        Supplier<?>[] functions = { function1, function2 };
+        final Object[] actual = LambdaUtil.getAll(functions);
         assertEquals(actual.length, functions.length);
         assertSame(expected1, actual[0]);
         assertSame(expected2, actual[1]);
     }
 
     @Test
-    public void testCallAllReturnsNullArrayIfCallablesArrayNull() {
-        final Object[] actual = LambdaUtil.callAll((Callable<?>[]) null);
+    public void testGetAllReturnsNullArrayIfSupplierArrayNull() {
+        final Object[] actual = LambdaUtil.getAll((Supplier<?>[]) null);
         assertNull(actual);
     }
 
     @Test
-    public void testCallAllReturnsNullElementsIfCallableArrayContainsNulls() {
-        final Callable<?>[] functions = new Callable[3];
-        final Object[] actual = LambdaUtil.callAll(functions);
+    public void testGetAllReturnsNullElementsIfSupplierArrayContainsNulls() {
+        final Supplier<?>[] functions = new Supplier[3];
+        final Object[] actual = LambdaUtil.getAll(functions);
         assertEquals(actual.length, functions.length);
         for (Object object : actual) {
             assertNull(object);
@@ -96,22 +123,22 @@ public class LambdaUtilTest {
     }
 
     @Test
-    public void testCallAllReturnsExceptionsIfCallablesThrowsException() {
-        final Exception expected1 = new RuntimeException();
-        Callable<String> function1 = new Callable<String>() {
-            public String call() throws Exception{
+    public void testGetAllReturnsExceptionsIfSuppliersThrowsException() {
+        final RuntimeException expected1 = new RuntimeException();
+        Supplier<String> function1 = new Supplier<String>() {
+            public String get() {
                 throw expected1;
             }
         };
-        final Exception expected2 = new RuntimeException();
-        Callable<String> function2 = new Callable<String>() {
-            public String call() throws Exception{
+        final RuntimeException expected2 = new RuntimeException();
+        Supplier<String> function2 = new Supplier<String>() {
+            public String get() {
                 throw expected2;
             }
         };
-        
-        Callable<?>[] functions = {function1, function2};
-        final Object[] actual = LambdaUtil.callAll(functions);
+
+        Supplier<?>[] functions = { function1, function2 };
+        final Object[] actual = LambdaUtil.getAll(functions);
         assertEquals(actual.length, functions.length);
         assertSame(expected1, actual[0]);
         assertSame(expected2, actual[1]);

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/12be6d86/src/site/xdoc/manual/api.xml
----------------------------------------------------------------------
diff --git a/src/site/xdoc/manual/api.xml b/src/site/xdoc/manual/api.xml
index 1783353..d7a8cd3 100644
--- a/src/site/xdoc/manual/api.xml
+++ b/src/site/xdoc/manual/api.xml
@@ -118,7 +118,7 @@ logger.printf(Level.INFO, "Logging in user %1$s with birthday %2$tm %2$te,%2$tY"
           <a name="LambdaSupport"/>
             <h4>Java 8 lambda support for lazy logging</h4>
             <p>
-              The <code>LambdaLogger</code> interface extends <code>Logger</code> to add support for lambda expressions.
+              The <code>Logger2</code> interface extends <code>Logger</code> to add support for lambda expressions.
               This logger allows client code to lazily log messages without explicitly checking if the requested log
               level is enabled. For example, previously you would write:
             </p>
@@ -129,12 +129,12 @@ if (logger.isTraceEnabled()) {
     logger.trace(&quot;Some long-running operation returned {}&quot;, expensiveOperation());
 }</pre>
             <p>
-              With Java 8 and the <code>LambdaLogger</code> interface, you can achieve the same effect by using a
+              With Java 8 and the <code>Logger2</code> interface, you can achieve the same effect by using a
               lambda expression. You no longer need to explicitly check the log level:
             </p>
             <pre class="prettyprint linenums">// Java-8 style optimization: no need to explicitly check the log level:
 // the lambda expression is not evaluated if the TRACE level is not enabled
-LambdaLogger logger = LogManager.getLambdaLogger();
+Logger2 logger = LogManager.getLogger2();
 logger.trace(&quot;Some long-running operation returned {}&quot;, () -> expensiveOperation());</pre>
 
           <h4>Logger Names</h4>


[2/2] logging-log4j2 git commit: LOG4J2-599 log4j lambda support - Renamed LambdaLogger to Logger2 - Renamed ExtendedLambdaLogger to ExtendedLogger2 - Renamed LogManager#getLambdaLogger methods to #getLogger2 - Introduced custom functional interface Supp

Posted by rp...@apache.org.
LOG4J2-599 log4j lambda support
- Renamed LambdaLogger to Logger2
- Renamed ExtendedLambdaLogger to ExtendedLogger2
- Renamed LogManager#getLambdaLogger methods to #getLogger2
- Introduced custom functional interface Supplier and replaced
Callable<?> in Logger2 with Supplier<?>
- LambdaSupport changes for Supplier instead of Callable
- Introduced custom functional interface MessageSupplier for lambda
expressions that create Message objects directly
- documentation updates
- initial Logger2Test (more tests to follow) 

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

Branch: refs/heads/LOG4J2-599-LambdaSupport
Commit: 12be6d867031c4579ccca856359d04482145e01e
Parents: 63a325d
Author: rpopma <rp...@apache.org>
Authored: Sun Aug 9 23:53:39 2015 +0900
Committer: rpopma <rp...@apache.org>
Committed: Sun Aug 9 23:53:39 2015 +0900

----------------------------------------------------------------------
 .../org/apache/logging/log4j/LambdaLogger.java  | 429 -----------
 .../org/apache/logging/log4j/LogManager.java    |  72 +-
 .../java/org/apache/logging/log4j/Logger2.java  | 738 +++++++++++++++++++
 .../logging/log4j/spi/AbstractLogger.java       | 270 +++++--
 .../logging/log4j/spi/ExtendedLambdaLogger.java |  56 --
 .../logging/log4j/spi/ExtendedLogger2.java      |  68 ++
 .../apache/logging/log4j/util/LambdaUtil.java   |  24 +-
 .../logging/log4j/util/MessageSupplier.java     |  40 +
 .../org/apache/logging/log4j/util/Supplier.java |  40 +
 .../org/apache/logging/log4j/Logger2Test.java   | 190 +++++
 .../logging/log4j/util/LambdaUtilTest.java      |  95 ++-
 src/site/xdoc/manual/api.xml                    |   6 +-
 12 files changed, 1409 insertions(+), 619 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/12be6d86/log4j-api/src/main/java/org/apache/logging/log4j/LambdaLogger.java
----------------------------------------------------------------------
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/LambdaLogger.java b/log4j-api/src/main/java/org/apache/logging/log4j/LambdaLogger.java
deleted file mode 100644
index 84a3fef..0000000
--- a/log4j-api/src/main/java/org/apache/logging/log4j/LambdaLogger.java
+++ /dev/null
@@ -1,429 +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;
-
-import java.util.concurrent.Callable;
-
-/**
- * Extends the {@code Logger} interface with support for lambda expressions.
- * <p>
- * This logger allows client code to lazily log messages without explicitly checking if the requested log level is
- * enabled. For example, previously one would write:
- * 
- * <pre>
- * // pre-Java 8 style optimization: explicitly check the log level
- * // to make sure the expensiveOperation() method is only called if necessary
- * Logger logger = LogManager.getLogger();
- * if (logger.isTraceEnabled()) {
- *     logger.trace(&quot;Some long-running operation returned {}&quot;, expensiveOperation());
- * }
- * </pre>
- * <p>
- * With Java 8 and the {@code LambdaLogger} interface, one can achieve the same effect by using a lambda expression:
- * 
- * <pre>
- * // Java-8 style optimization: no need to explicitly check the log level:
- * // the lambda expression is not evaluated if the TRACE level is not enabled
- * LambdaLogger logger = LogManager.getLambdaLogger();
- * logger.trace(&quot;Some long-running operation returned {}&quot;, () -&gt; expensiveOperation());
- * </pre>
- */
-public interface LambdaLogger extends Logger {
-
-    /**
-     * Logs a message which is only to be constructed if the logging level is the {@link Level#DEBUG DEBUG} level.
-     *
-     * @param msgSupplier A function, which when called, produces the desired log message.
-     */
-    void debug(Callable<?> msgSupplier);
-
-    /**
-     * Logs a message (only to be constructed if the logging level is the {@link Level#DEBUG DEBUG} level) including the
-     * stack trace of the {@link Throwable} <code>t</code> passed as parameter.
-     *
-     * @param msgSupplier A function, which when called, produces the desired log message.
-     * @param t the exception to log, including its stack trace.
-     */
-    void debug(Callable<?> msgSupplier, Throwable t);
-
-    /**
-     * Logs a message which is only to be constructed if the logging level is the {@link Level#DEBUG DEBUG} level with
-     * the specified Marker.
-     *
-     * @param marker the marker data specific to this log statement
-     * @param msgSupplier A function, which when called, produces the desired log message.
-     */
-    void debug(Marker marker, Callable<?> msgSupplier);
-
-    /**
-     * Logs a message (only to be constructed if the logging level is the {@link Level#DEBUG DEBUG} level) with the
-     * specified Marker and including the stack trace of the {@link Throwable} <code>t</code> passed as parameter.
-     *
-     * @param marker the marker data specific to this log statement
-     * @param msgSupplier A function, which when called, produces the desired log message.
-     * @param t A Throwable or null.
-     */
-    void debug(Marker marker, Callable<?> msgSupplier, Throwable t);
-
-    /**
-     * Logs a message with parameters which are only to be constructed if the logging level is the {@link Level#DEBUG
-     * DEBUG} level.
-     *
-     * @param marker the marker data specific to this log statement
-     * @param message the message to log; the format depends on the message factory.
-     * @param paramSuppliers An array of functions, which when called, produce the desired log message parameters.
-     */
-    void debug(Marker marker, String message, Callable<?>... paramSuppliers);
-
-    /**
-     * Logs a message with parameters which are only to be constructed if the logging level is the {@link Level#DEBUG
-     * DEBUG} level.
-     *
-     * @param message the message to log; the format depends on the message factory.
-     * @param paramSuppliers An array of functions, which when called, produce the desired log message parameters.
-     */
-    void debug(String message, Callable<?>... paramSuppliers);
-
-    /**
-     * Logs a message which is only to be constructed if the logging level is the {@link Level#ERROR ERROR} level.
-     *
-     * @param msgSupplier A function, which when called, produces the desired log message.
-     */
-    void error(Callable<?> msgSupplier);
-
-    /**
-     * Logs a message (only to be constructed if the logging level is the {@link Level#ERROR ERROR} level) including the
-     * stack trace of the {@link Throwable} <code>t</code> passed as parameter.
-     *
-     * @param msgSupplier A function, which when called, produces the desired log message.
-     * @param t the exception to log, including its stack trace.
-     */
-    void error(Callable<?> msgSupplier, Throwable t);
-
-    /**
-     * Logs a message which is only to be constructed if the logging level is the {@link Level#ERROR ERROR} level with
-     * the specified Marker.
-     *
-     * @param marker the marker data specific to this log statement
-     * @param msgSupplier A function, which when called, produces the desired log message.
-     */
-    void error(Marker marker, Callable<?> msgSupplier);
-
-    /**
-     * Logs a message (only to be constructed if the logging level is the {@link Level#ERROR ERROR} level) with the
-     * specified Marker and including the stack trace of the {@link Throwable} <code>t</code> passed as parameter.
-     *
-     * @param marker the marker data specific to this log statement
-     * @param msgSupplier A function, which when called, produces the desired log message.
-     * @param t A Throwable or null.
-     */
-    void error(Marker marker, Callable<?> msgSupplier, Throwable t);
-
-    /**
-     * Logs a message with parameters which are only to be constructed if the logging level is the {@link Level#ERROR
-     * ERROR} level.
-     *
-     * @param marker the marker data specific to this log statement
-     * @param message the message to log; the format depends on the message factory.
-     * @param paramSuppliers An array of functions, which when called, produce the desired log message parameters.
-     */
-    void error(Marker marker, String message, Callable<?>... paramSuppliers);
-
-    /**
-     * Logs a message with parameters which are only to be constructed if the logging level is the {@link Level#ERROR
-     * ERROR} level.
-     *
-     * @param message the message to log; the format depends on the message factory.
-     * @param paramSuppliers An array of functions, which when called, produce the desired log message parameters.
-     */
-    void error(String message, Callable<?>... paramSuppliers);
-
-    /**
-     * Logs a message which is only to be constructed if the logging level is the {@link Level#FATAL FATAL} level.
-     *
-     * @param msgSupplier A function, which when called, produces the desired log message.
-     */
-    void fatal(Callable<?> msgSupplier);
-
-    /**
-     * Logs a message (only to be constructed if the logging level is the {@link Level#FATAL FATAL} level) including the
-     * stack trace of the {@link Throwable} <code>t</code> passed as parameter.
-     *
-     * @param msgSupplier A function, which when called, produces the desired log message.
-     * @param t the exception to log, including its stack trace.
-     */
-    void fatal(Callable<?> msgSupplier, Throwable t);
-
-    /**
-     * Logs a message which is only to be constructed if the logging level is the {@link Level#FATAL FATAL} level with
-     * the specified Marker.
-     *
-     * @param marker the marker data specific to this log statement
-     * @param msgSupplier A function, which when called, produces the desired log message.
-     */
-    void fatal(Marker marker, Callable<?> msgSupplier);
-
-    /**
-     * Logs a message (only to be constructed if the logging level is the {@link Level#FATAL FATAL} level) with the
-     * specified Marker and including the stack trace of the {@link Throwable} <code>t</code> passed as parameter.
-     *
-     * @param marker the marker data specific to this log statement
-     * @param msgSupplier A function, which when called, produces the desired log message.
-     * @param t A Throwable or null.
-     */
-    void fatal(Marker marker, Callable<?> msgSupplier, Throwable t);
-
-    /**
-     * Logs a message with parameters which are only to be constructed if the logging level is the {@link Level#FATAL
-     * FATAL} level.
-     *
-     * @param marker the marker data specific to this log statement
-     * @param message the message to log; the format depends on the message factory.
-     * @param paramSuppliers An array of functions, which when called, produce the desired log message parameters.
-     */
-    void fatal(Marker marker, String message, Callable<?>... paramSuppliers);
-
-    /**
-     * Logs a message with parameters which are only to be constructed if the logging level is the {@link Level#FATAL
-     * FATAL} level.
-     *
-     * @param message the message to log; the format depends on the message factory.
-     * @param paramSuppliers An array of functions, which when called, produce the desired log message parameters.
-     */
-    void fatal(String message, Callable<?>... paramSuppliers);
-
-    /**
-     * Logs a message which is only to be constructed if the logging level is the {@link Level#INFO INFO} level.
-     *
-     * @param msgSupplier A function, which when called, produces the desired log message.
-     */
-    void info(Callable<?> msgSupplier);
-
-    /**
-     * Logs a message (only to be constructed if the logging level is the {@link Level#INFO INFO} level) including the
-     * stack trace of the {@link Throwable} <code>t</code> passed as parameter.
-     *
-     * @param msgSupplier A function, which when called, produces the desired log message.
-     * @param t the exception to log, including its stack trace.
-     */
-    void info(Callable<?> msgSupplier, Throwable t);
-
-    /**
-     * Logs a message which is only to be constructed if the logging level is the {@link Level#INFO INFO} level with the
-     * specified Marker.
-     *
-     * @param marker the marker data specific to this log statement
-     * @param msgSupplier A function, which when called, produces the desired log message.
-     */
-    void info(Marker marker, Callable<?> msgSupplier);
-
-    /**
-     * Logs a message (only to be constructed if the logging level is the {@link Level#INFO INFO} level) with the
-     * specified Marker and including the stack trace of the {@link Throwable} <code>t</code> passed as parameter.
-     *
-     * @param marker the marker data specific to this log statement
-     * @param msgSupplier A function, which when called, produces the desired log message.
-     * @param t A Throwable or null.
-     */
-    void info(Marker marker, Callable<?> msgSupplier, Throwable t);
-
-    /**
-     * Logs a message with parameters which are only to be constructed if the logging level is the {@link Level#INFO
-     * INFO} level.
-     *
-     * @param marker the marker data specific to this log statement
-     * @param message the message to log; the format depends on the message factory.
-     * @param paramSuppliers An array of functions, which when called, produce the desired log message parameters.
-     */
-    void info(Marker marker, String message, Callable<?>... paramSuppliers);
-
-    /**
-     * Logs a message with parameters which are only to be constructed if the logging level is the {@link Level#INFO
-     * INFO} level.
-     *
-     * @param message the message to log; the format depends on the message factory.
-     * @param paramSuppliers An array of functions, which when called, produce the desired log message parameters.
-     */
-    void info(String message, Callable<?>... paramSuppliers);
-
-    /**
-     * Logs a message which is only to be constructed if the logging level is the specified level.
-     *
-     * @param level the logging level
-     * @param msgSupplier A function, which when called, produces the desired log message.
-     */
-    void log(Level level, Callable<?> msgSupplier);
-
-    /**
-     * Logs a message (only to be constructed if the logging level is the specified level) including the stack log of
-     * the {@link Throwable} <code>t</code> passed as parameter.
-     *
-     * @param level the logging level
-     * @param msgSupplier A function, which when called, produces the desired log message.
-     * @param t the exception to log, including its stack log.
-     */
-    void log(Level level, Callable<?> msgSupplier, Throwable t);
-
-    /**
-     * Logs a message (only to be constructed if the logging level is the specified level) with the specified Marker.
-     *
-     * @param level the logging level
-     * @param marker the marker data specific to this log statement
-     * @param msgSupplier A function, which when called, produces the desired log message.
-     */
-    void log(Level level, Marker marker, Callable<?> msgSupplier);
-
-    /**
-     * Logs a message (only to be constructed if the logging level is the specified level) with the specified Marker and
-     * including the stack log of the {@link Throwable} <code>t</code> passed as parameter.
-     *
-     * @param level the logging level
-     * @param marker the marker data specific to this log statement
-     * @param msgSupplier A function, which when called, produces the desired log message.
-     * @param t A Throwable or null.
-     */
-    void log(Level level, Marker marker, Callable<?> msgSupplier, Throwable t);
-
-    /**
-     * Logs a message with parameters which are only to be constructed if the logging level is the specified level.
-     *
-     * @param level the logging level
-     * @param marker the marker data specific to this log statement
-     * @param message the message to log; the format depends on the message factory.
-     * @param paramSuppliers An array of functions, which when called, produce the desired log message parameters.
-     */
-    void log(Level level, Marker marker, String message, Callable<?>... paramSuppliers);
-
-    /**
-     * Logs a message with parameters which are only to be constructed if the logging level is the specified level.
-     *
-     * @param level the logging level
-     * @param message the message to log; the format depends on the message factory.
-     * @param paramSuppliers An array of functions, which when called, produce the desired log message parameters.
-     */
-    void log(Level level, String message, Callable<?>... paramSuppliers);
-
-    /**
-     * Logs a message which is only to be constructed if the logging level is the {@link Level#TRACE TRACE} level.
-     *
-     * @param msgSupplier A function, which when called, produces the desired log message.
-     */
-    void trace(Callable<?> msgSupplier);
-
-    /**
-     * Logs a message (only to be constructed if the logging level is the {@link Level#TRACE TRACE} level) including the
-     * stack trace of the {@link Throwable} <code>t</code> passed as parameter.
-     *
-     * @param msgSupplier A function, which when called, produces the desired log message.
-     * @param t the exception to log, including its stack trace.
-     */
-    void trace(Callable<?> msgSupplier, Throwable t);
-
-    /**
-     * Logs a message which is only to be constructed if the logging level is the {@link Level#TRACE TRACE} level with
-     * the specified Marker.
-     *
-     * @param marker the marker data specific to this log statement
-     * @param msgSupplier A function, which when called, produces the desired log message.
-     */
-    void trace(Marker marker, Callable<?> msgSupplier);
-
-    /**
-     * Logs a message (only to be constructed if the logging level is the {@link Level#TRACE TRACE} level) with the
-     * specified Marker and including the stack trace of the {@link Throwable} <code>t</code> passed as parameter.
-     *
-     * @param marker the marker data specific to this log statement
-     * @param msgSupplier A function, which when called, produces the desired log message.
-     * @param t A Throwable or null.
-     */
-    void trace(Marker marker, Callable<?> msgSupplier, Throwable t);
-
-    /**
-     * Logs a message with parameters which are only to be constructed if the logging level is the {@link Level#TRACE
-     * TRACE} level.
-     *
-     * @param marker the marker data specific to this log statement
-     * @param message the message to log; the format depends on the message factory.
-     * @param paramSuppliers An array of functions, which when called, produce the desired log message parameters.
-     */
-    void trace(Marker marker, String message, Callable<?>... paramSuppliers);
-
-    /**
-     * Logs a message with parameters which are only to be constructed if the logging level is the {@link Level#TRACE
-     * TRACE} level.
-     *
-     * @param message the message to log; the format depends on the message factory.
-     * @param paramSuppliers An array of functions, which when called, produce the desired log message parameters.
-     */
-    void trace(String message, Callable<?>... paramSuppliers);
-
-    /**
-     * Logs a message which is only to be constructed if the logging level is the {@link Level#WARN WARN} level.
-     *
-     * @param msgSupplier A function, which when called, produces the desired log message.
-     */
-    void warn(Callable<?> msgSupplier);
-
-    /**
-     * Logs a message (only to be constructed if the logging level is the {@link Level#WARN WARN} level) including the
-     * stack warn of the {@link Throwable} <code>t</code> passed as parameter.
-     *
-     * @param msgSupplier A function, which when called, produces the desired log message.
-     * @param t the exception to log, including its stack warn.
-     */
-    void warn(Callable<?> msgSupplier, Throwable t);
-
-    /**
-     * Logs a message which is only to be constructed if the logging level is the {@link Level#WARN WARN} level with the
-     * specified Marker.
-     *
-     * @param marker the marker data specific to this log statement
-     * @param msgSupplier A function, which when called, produces the desired log message.
-     */
-    void warn(Marker marker, Callable<?> msgSupplier);
-
-    /**
-     * Logs a message (only to be constructed if the logging level is the {@link Level#WARN WARN} level) with the
-     * specified Marker and including the stack warn of the {@link Throwable} <code>t</code> passed as parameter.
-     *
-     * @param marker the marker data specific to this log statement
-     * @param msgSupplier A function, which when called, produces the desired log message.
-     * @param t A Throwable or null.
-     */
-    void warn(Marker marker, Callable<?> msgSupplier, Throwable t);
-
-    /**
-     * Logs a message with parameters which are only to be constructed if the logging level is the {@link Level#WARN
-     * WARN} level.
-     *
-     * @param marker the marker data specific to this log statement
-     * @param message the message to log; the format depends on the message factory.
-     * @param paramSuppliers An array of functions, which when called, produce the desired log message parameters.
-     */
-    void warn(Marker marker, String message, Callable<?>... paramSuppliers);
-
-    /**
-     * Logs a message with parameters which are only to be constructed if the logging level is the {@link Level#WARN
-     * WARN} level.
-     *
-     * @param message the message to log; the format depends on the message factory.
-     * @param paramSuppliers An array of functions, which when called, produce the desired log message parameters.
-     */
-    void warn(String message, Callable<?>... paramSuppliers);
-
-}

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/12be6d86/log4j-api/src/main/java/org/apache/logging/log4j/LogManager.java
----------------------------------------------------------------------
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/LogManager.java b/log4j-api/src/main/java/org/apache/logging/log4j/LogManager.java
index f4aa848..196aa9f 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/LogManager.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/LogManager.java
@@ -416,12 +416,13 @@ public class LogManager {
     }
 
     /**
-     * Returns a LambdaLogger with the name of the calling class.
-     * @return The LambdaLogger for the calling class.
+     * Returns a Logger2 with the name of the calling class.
+     * @return The Logger2 for the calling class.
      * @throws UnsupportedOperationException if the calling class cannot be determined.
+     * @since log4j-2.4
      */
-    public static LambdaLogger getLambdaLogger() {
-        return (LambdaLogger) getLogger(ReflectionUtil.getCallerClass(2));
+    public static Logger2 getLogger2() {
+        return (Logger2) getLogger(ReflectionUtil.getCallerClass(2));
     }
     
     private static Class<?> callerClass(final Class<?> clazz) {
@@ -436,90 +437,97 @@ public class LogManager {
     }
 
     /**
-     * Returns a LambdaLogger using the fully qualified name of the Class as the Logger name.
+     * Returns a Logger2 using the fully qualified name of the Class as the Logger name.
      * @param clazz The Class whose name should be used as the Logger name. If null it will default to the calling
      *              class.
-     * @return The LambdaLogger.
+     * @return The Logger2.
      * @throws UnsupportedOperationException if {@code clazz} is {@code null} and the calling class cannot be determined.
+     * @since log4j-2.4
      */
-    public static LambdaLogger getLambdaLogger(final Class<?> clazz) {
+    public static Logger2 getLogger2(final Class<?> clazz) {
         final Class<?> cls = callerClass(clazz);
-        return (LambdaLogger) getContext(cls.getClassLoader(), false).getLogger(cls.getName());
+        return (Logger2) getContext(cls.getClassLoader(), false).getLogger(cls.getName());
     }
 
     /**
-     * Returns a LambdaLogger using the fully qualified name of the Class as the Logger name.
+     * Returns a Logger2 using the fully qualified name of the Class as the Logger name.
      * @param clazz The Class whose name should be used as the Logger name. If null it will default to the calling
      *              class.
      * @param messageFactory The message factory is used only when creating a logger, subsequent use does not change
      *                       the logger but will log a warning if mismatched.
-     * @return The LambdaLogger.
+     * @return The Logger2.
      * @throws UnsupportedOperationException if {@code clazz} is {@code null} and the calling class cannot be determined.
+     * @since log4j-2.4
      */
-    public static LambdaLogger getLambdaLogger(final Class<?> clazz, final MessageFactory messageFactory) {
+    public static Logger2 getLogger2(final Class<?> clazz, final MessageFactory messageFactory) {
         final Class<?> cls = callerClass(clazz);
-        return (LambdaLogger) getContext(cls.getClassLoader(), false).getLogger(cls.getName(), messageFactory);
+        return (Logger2) getContext(cls.getClassLoader(), false).getLogger(cls.getName(), messageFactory);
     }
 
     /**
-     * Returns a LambdaLogger with the name of the calling class.
+     * Returns a Logger2 with the name of the calling class.
      * @param messageFactory The message factory is used only when creating a logger, subsequent use does not change
      *                       the logger but will log a warning if mismatched.
-     * @return The LambdaLogger for the calling class.
+     * @return The Logger2 for the calling class.
      * @throws UnsupportedOperationException if the calling class cannot be determined.
+     * @since log4j-2.4
      */
-    public static LambdaLogger getLambdaLogger(final MessageFactory messageFactory) {
-        return (LambdaLogger) getLogger(ReflectionUtil.getCallerClass(2), messageFactory);
+    public static Logger2 getLogger2(final MessageFactory messageFactory) {
+        return (Logger2) getLogger(ReflectionUtil.getCallerClass(2), messageFactory);
     }
 
     /**
-     * Returns a LambdaLogger using the fully qualified class name of the value as the Logger name.
+     * Returns a Logger2 using the fully qualified class name of the value as the Logger name.
      * @param value The value whose class name should be used as the Logger name. If null the name of the calling
      *              class will be used as the logger name.
-     * @return The LambdaLogger.
+     * @return The Logger2.
      * @throws UnsupportedOperationException if {@code value} is {@code null} and the calling class cannot be determined.
+     * @since log4j-2.4
      */
-    public static LambdaLogger getLambdaLogger(final Object value) {
-        return (LambdaLogger) getLogger(value != null ? value.getClass() : ReflectionUtil.getCallerClass(2));
+    public static Logger2 getLogger2(final Object value) {
+        return (Logger2) getLogger(value != null ? value.getClass() : ReflectionUtil.getCallerClass(2));
     }
 
     /**
-     * Returns a LambdaLogger using the fully qualified class name of the value as the Logger name.
+     * Returns a Logger2 using the fully qualified class name of the value as the Logger name.
      * @param value The value whose class name should be used as the Logger name. If null the name of the calling
      *              class will be used as the logger name.
      * @param messageFactory The message factory is used only when creating a logger, subsequent use does not change
      *                       the logger but will log a warning if mismatched.
-     * @return The LambdaLogger.
+     * @return The Logger2.
      * @throws UnsupportedOperationException if {@code value} is {@code null} and the calling class cannot be determined.
+     * @since log4j-2.4
      */
-    public static LambdaLogger getLambdaLogger(final Object value, final MessageFactory messageFactory) {
-        return (LambdaLogger) getLogger(value != null ? value.getClass() : ReflectionUtil.getCallerClass(2),
+    public static Logger2 getLogger2(final Object value, final MessageFactory messageFactory) {
+        return (Logger2) getLogger(value != null ? value.getClass() : ReflectionUtil.getCallerClass(2),
                 messageFactory);
     }
 
     /**
-     * Returns a LambdaLogger with the specified name.
+     * Returns a Logger2 with the specified name.
      *
      * @param name The logger name. If null the name of the calling class will be used.
-     * @return The LambdaLogger.
+     * @return The Logger2.
      * @throws UnsupportedOperationException if {@code name} is {@code null} and the calling class cannot be determined.
+     * @since log4j-2.4
      */
-    public static LambdaLogger getLambdaLogger(final String name) {
-        return (LambdaLogger) (name != null ? getContext(false).getLogger(name) : getLogger(
+    public static Logger2 getLogger2(final String name) {
+        return (Logger2) (name != null ? getContext(false).getLogger(name) : getLogger(
                 ReflectionUtil.getCallerClass(2)));
     }
 
     /**
-     * Returns a LambdaLogger with the specified name.
+     * Returns a Logger2 with the specified name.
      *
      * @param name The logger name. If null the name of the calling class will be used.
      * @param messageFactory The message factory is used only when creating a logger, subsequent use does not change
      *                       the logger but will log a warning if mismatched.
-     * @return The LambdaLogger.
+     * @return The Logger2.
      * @throws UnsupportedOperationException if {@code name} is {@code null} and the calling class cannot be determined.
+     * @since log4j-2.4
      */
-    public static LambdaLogger getLambdaLogger(final String name, final MessageFactory messageFactory) {
-        return (LambdaLogger) (name != null ? getContext(false).getLogger(name, messageFactory) : getLogger(
+    public static Logger2 getLogger2(final String name, final MessageFactory messageFactory) {
+        return (Logger2) (name != null ? getContext(false).getLogger(name, messageFactory) : getLogger(
             ReflectionUtil.getCallerClass(2), messageFactory));
     }
 

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/12be6d86/log4j-api/src/main/java/org/apache/logging/log4j/Logger2.java
----------------------------------------------------------------------
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/Logger2.java b/log4j-api/src/main/java/org/apache/logging/log4j/Logger2.java
new file mode 100644
index 0000000..4315841
--- /dev/null
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/Logger2.java
@@ -0,0 +1,738 @@
+/*
+ * 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;
+
+import org.apache.logging.log4j.message.MessageFactory;
+import org.apache.logging.log4j.util.MessageSupplier;
+import org.apache.logging.log4j.util.Supplier;
+
+/**
+ * Extends the {@code Logger} interface with support for lambda expressions.
+ * <p>
+ * This logger allows client code to lazily log messages without explicitly checking if the requested log level is
+ * enabled. For example, previously one would write:
+ * 
+ * <pre>
+ * // pre-Java 8 style optimization: explicitly check the log level
+ * // to make sure the expensiveOperation() method is only called if necessary
+ * Logger logger = LogManager.getLogger();
+ * if (logger.isTraceEnabled()) {
+ *     logger.trace(&quot;Some long-running operation returned {}&quot;, expensiveOperation());
+ * }
+ * </pre>
+ * <p>
+ * With Java 8 and the {@code Logger2} interface, one can achieve the same effect by using a lambda expression:
+ * 
+ * <pre>
+ * // Java-8 style optimization: no need to explicitly check the log level:
+ * // the lambda expression is not evaluated if the TRACE level is not enabled
+ * Logger2 logger = LogManager.getLogger2();
+ * logger.trace(&quot;Some long-running operation returned {}&quot;, () -&gt; expensiveOperation());
+ * </pre>
+ * 
+ * @since log4j-2.4
+ */
+public interface Logger2 extends Logger {
+
+    /**
+     * Logs a message which is only to be constructed if the logging level is the {@link Level#DEBUG DEBUG} level.
+     *
+     * @param msgSupplier A function, which when called, produces the desired log message; the format depends on the
+     *            message factory.
+     */
+    void debug(Supplier<?> msgSupplier);
+
+    /**
+     * Logs a message (only to be constructed if the logging level is the {@link Level#DEBUG DEBUG} level) including the
+     * stack trace of the {@link Throwable} <code>t</code> passed as parameter.
+     *
+     * @param msgSupplier A function, which when called, produces the desired log message; the format depends on the
+     *            message factory.
+     * @param t the exception to log, including its stack trace.
+     */
+    void debug(Supplier<?> msgSupplier, Throwable t);
+
+    /**
+     * Logs a message which is only to be constructed if the logging level is the {@link Level#DEBUG DEBUG} level with
+     * the specified Marker.
+     *
+     * @param marker the marker data specific to this log statement
+     * @param msgSupplier A function, which when called, produces the desired log message; the format depends on the
+     *            message factory.
+     */
+    void debug(Marker marker, Supplier<?> msgSupplier);
+
+    /**
+     * Logs a message (only to be constructed if the logging level is the {@link Level#DEBUG DEBUG} level) with the
+     * specified Marker and including the stack trace of the {@link Throwable} <code>t</code> passed as parameter.
+     *
+     * @param marker the marker data specific to this log statement
+     * @param msgSupplier A function, which when called, produces the desired log message; the format depends on the
+     *            message factory.
+     * @param t A Throwable or null.
+     */
+    void debug(Marker marker, Supplier<?> msgSupplier, Throwable t);
+
+    /**
+     * Logs a message which is only to be constructed if the logging level is the {@link Level#DEBUG DEBUG} level with
+     * the specified Marker. The {@code MessageSupplier} may or may not use the {@link MessageFactory} to construct the
+     * {@code Message}.
+     *
+     * @param marker the marker data specific to this log statement
+     * @param msgSupplier A function, which when called, produces the desired log message.
+     */
+    void debug(Marker marker, MessageSupplier msgSupplier);
+
+    /**
+     * Logs a message (only to be constructed if the logging level is the {@link Level#DEBUG DEBUG} level) with the
+     * specified Marker and including the stack trace of the {@link Throwable} <code>t</code> passed as parameter. The
+     * {@code MessageSupplier} may or may not use the {@link MessageFactory} to construct the {@code Message}.
+     *
+     * @param marker the marker data specific to this log statement
+     * @param msgSupplier A function, which when called, produces the desired log message.
+     * @param t A Throwable or null.
+     */
+    void debug(Marker marker, MessageSupplier msgSupplier, Throwable t);
+
+    /**
+     * Logs a message which is only to be constructed if the logging level is the {@link Level#DEBUG DEBUG} level. The
+     * {@code MessageSupplier} may or may not use the {@link MessageFactory} to construct the {@code Message}.
+     *
+     * @param msgSupplier A function, which when called, produces the desired log message.
+     */
+    void debug(MessageSupplier msgSupplier);
+
+    /**
+     * Logs a message (only to be constructed if the logging level is the {@link Level#DEBUG DEBUG} level) including the
+     * stack trace of the {@link Throwable} <code>t</code> passed as parameter. The {@code MessageSupplier} may or may
+     * not use the {@link MessageFactory} to construct the {@code Message}.
+     *
+     * @param msgSupplier A function, which when called, produces the desired log message.
+     * @param t the exception to log, including its stack trace.
+     */
+    void debug(MessageSupplier msgSupplier, Throwable t);
+
+    /**
+     * Logs a message with parameters which are only to be constructed if the logging level is the {@link Level#DEBUG
+     * DEBUG} level.
+     *
+     * @param marker the marker data specific to this log statement
+     * @param message the message to log; the format depends on the message factory.
+     * @param paramSuppliers An array of functions, which when called, produce the desired log message parameters.
+     */
+    void debug(Marker marker, String message, Supplier<?>... paramSuppliers);
+
+    /**
+     * Logs a message with parameters which are only to be constructed if the logging level is the {@link Level#DEBUG
+     * DEBUG} level.
+     *
+     * @param message the message to log; the format depends on the message factory.
+     * @param paramSuppliers An array of functions, which when called, produce the desired log message parameters.
+     */
+    void debug(String message, Supplier<?>... paramSuppliers);
+
+    /**
+     * Logs a message which is only to be constructed if the logging level is the {@link Level#ERROR ERROR} level.
+     *
+     * @param msgSupplier A function, which when called, produces the desired log message; the format depends on the
+     *            message factory.
+     */
+    void error(Supplier<?> msgSupplier);
+
+    /**
+     * Logs a message (only to be constructed if the logging level is the {@link Level#ERROR ERROR} level) including the
+     * stack trace of the {@link Throwable} <code>t</code> passed as parameter.
+     *
+     * @param msgSupplier A function, which when called, produces the desired log message; the format depends on the
+     *            message factory.
+     * @param t the exception to log, including its stack trace.
+     */
+    void error(Supplier<?> msgSupplier, Throwable t);
+
+    /**
+     * Logs a message which is only to be constructed if the logging level is the {@link Level#ERROR ERROR} level with
+     * the specified Marker.
+     *
+     * @param marker the marker data specific to this log statement
+     * @param msgSupplier A function, which when called, produces the desired log message; the format depends on the
+     *            message factory.
+     */
+    void error(Marker marker, Supplier<?> msgSupplier);
+
+    /**
+     * Logs a message (only to be constructed if the logging level is the {@link Level#ERROR ERROR} level) with the
+     * specified Marker and including the stack trace of the {@link Throwable} <code>t</code> passed as parameter.
+     *
+     * @param marker the marker data specific to this log statement
+     * @param msgSupplier A function, which when called, produces the desired log message; the format depends on the
+     *            message factory.
+     * @param t A Throwable or null.
+     */
+    void error(Marker marker, Supplier<?> msgSupplier, Throwable t);
+
+    /**
+     * Logs a message with parameters which are only to be constructed if the logging level is the {@link Level#ERROR
+     * ERROR} level.
+     *
+     * @param marker the marker data specific to this log statement
+     * @param message the message to log; the format depends on the message factory.
+     * @param paramSuppliers An array of functions, which when called, produce the desired log message parameters.
+     */
+    void error(Marker marker, String message, Supplier<?>... paramSuppliers);
+
+    /**
+     * Logs a message which is only to be constructed if the logging level is the {@link Level#ERROR ERROR} level with
+     * the specified Marker. 
+     * The {@code MessageSupplier} may or may not use the {@link MessageFactory} to construct the {@code Message}.
+     *
+     * @param marker the marker data specific to this log statement
+     * @param msgSupplier A function, which when called, produces the desired log message.
+     */
+    void error(Marker marker, MessageSupplier msgSupplier);
+
+    /**
+     * Logs a message (only to be constructed if the logging level is the {@link Level#ERROR ERROR} level) with the
+     * specified Marker and including the stack trace of the {@link Throwable} <code>t</code> passed as parameter.
+     * The {@code MessageSupplier} may or may not use the {@link MessageFactory} to construct the {@code Message}.
+     *
+     * @param marker the marker data specific to this log statement
+     * @param msgSupplier A function, which when called, produces the desired log message.
+     * @param t A Throwable or null.
+     */
+    void error(Marker marker, MessageSupplier msgSupplier, Throwable t);
+
+    /**
+     * Logs a message which is only to be constructed if the logging level is the {@link Level#ERROR ERROR} level.
+     * The {@code MessageSupplier} may or may not use the {@link MessageFactory} to construct the {@code Message}.
+     *
+     * @param msgSupplier A function, which when called, produces the desired log message.
+     */
+    void error(MessageSupplier msgSupplier);
+
+    /**
+     * Logs a message (only to be constructed if the logging level is the {@link Level#ERROR ERROR} level) including the
+     * stack trace of the {@link Throwable} <code>t</code> passed as parameter.
+     * The {@code MessageSupplier} may or may not use the {@link MessageFactory} to construct the {@code Message}.
+     *
+     * @param msgSupplier A function, which when called, produces the desired log message.
+     * @param t the exception to log, including its stack trace.
+     */
+    void error(MessageSupplier msgSupplier, Throwable t);
+
+    /**
+     * Logs a message with parameters which are only to be constructed if the logging level is the {@link Level#ERROR
+     * ERROR} level.
+     *
+     * @param message the message to log; the format depends on the message factory.
+     * @param paramSuppliers An array of functions, which when called, produce the desired log message parameters.
+     */
+    void error(String message, Supplier<?>... paramSuppliers);
+
+    /**
+     * Logs a message which is only to be constructed if the logging level is the {@link Level#FATAL FATAL} level.
+     *
+     * @param msgSupplier A function, which when called, produces the desired log message; the format depends on the
+     *            message factory.
+     */
+    void fatal(Supplier<?> msgSupplier);
+
+    /**
+     * Logs a message (only to be constructed if the logging level is the {@link Level#FATAL FATAL} level) including the
+     * stack trace of the {@link Throwable} <code>t</code> passed as parameter.
+     *
+     * @param msgSupplier A function, which when called, produces the desired log message; the format depends on the
+     *            message factory.
+     * @param t the exception to log, including its stack trace.
+     */
+    void fatal(Supplier<?> msgSupplier, Throwable t);
+
+    /**
+     * Logs a message which is only to be constructed if the logging level is the {@link Level#FATAL FATAL} level with
+     * the specified Marker.
+     *
+     * @param marker the marker data specific to this log statement
+     * @param msgSupplier A function, which when called, produces the desired log message; the format depends on the
+     *            message factory.
+     */
+    void fatal(Marker marker, Supplier<?> msgSupplier);
+
+    /**
+     * Logs a message (only to be constructed if the logging level is the {@link Level#FATAL FATAL} level) with the
+     * specified Marker and including the stack trace of the {@link Throwable} <code>t</code> passed as parameter.
+     *
+     * @param marker the marker data specific to this log statement
+     * @param msgSupplier A function, which when called, produces the desired log message; the format depends on the
+     *            message factory.
+     * @param t A Throwable or null.
+     */
+    void fatal(Marker marker, Supplier<?> msgSupplier, Throwable t);
+
+    /**
+     * Logs a message with parameters which are only to be constructed if the logging level is the {@link Level#FATAL
+     * FATAL} level.
+     *
+     * @param marker the marker data specific to this log statement
+     * @param message the message to log; the format depends on the message factory.
+     * @param paramSuppliers An array of functions, which when called, produce the desired log message parameters.
+     */
+    void fatal(Marker marker, String message, Supplier<?>... paramSuppliers);
+
+    /**
+     * Logs a message which is only to be constructed if the logging level is the {@link Level#FATAL FATAL} level with
+     * the specified Marker. 
+     * The {@code MessageSupplier} may or may not use the {@link MessageFactory} to construct the {@code Message}.
+     *
+     * @param marker the marker data specific to this log statement
+     * @param msgSupplier A function, which when called, produces the desired log message.
+     */
+    void fatal(Marker marker, MessageSupplier msgSupplier);
+
+    /**
+     * Logs a message (only to be constructed if the logging level is the {@link Level#FATAL FATAL} level) with the
+     * specified Marker and including the stack trace of the {@link Throwable} <code>t</code> passed as parameter.
+     * The {@code MessageSupplier} may or may not use the {@link MessageFactory} to construct the {@code Message}.
+     *
+     * @param marker the marker data specific to this log statement
+     * @param msgSupplier A function, which when called, produces the desired log message.
+     * @param t A Throwable or null.
+     */
+    void fatal(Marker marker, MessageSupplier msgSupplier, Throwable t);
+
+    /**
+     * Logs a message which is only to be constructed if the logging level is the {@link Level#FATAL FATAL} level.
+     * The {@code MessageSupplier} may or may not use the {@link MessageFactory} to construct the {@code Message}.
+     *
+     * @param msgSupplier A function, which when called, produces the desired log message.
+     */
+    void fatal(MessageSupplier msgSupplier);
+
+    /**
+     * Logs a message (only to be constructed if the logging level is the {@link Level#FATAL FATAL} level) including the
+     * stack trace of the {@link Throwable} <code>t</code> passed as parameter.
+     * The {@code MessageSupplier} may or may not use the {@link MessageFactory} to construct the {@code Message}.
+     *
+     * @param msgSupplier A function, which when called, produces the desired log message.
+     * @param t the exception to log, including its stack trace.
+     */
+    void fatal(MessageSupplier msgSupplier, Throwable t);
+
+    /**
+     * Logs a message with parameters which are only to be constructed if the logging level is the {@link Level#FATAL
+     * FATAL} level.
+     *
+     * @param message the message to log; the format depends on the message factory.
+     * @param paramSuppliers An array of functions, which when called, produce the desired log message parameters.
+     */
+    void fatal(String message, Supplier<?>... paramSuppliers);
+
+    /**
+     * Logs a message which is only to be constructed if the logging level is the {@link Level#INFO INFO} level.
+     *
+     * @param msgSupplier A function, which when called, produces the desired log message; the format depends on the
+     *            message factory.
+     */
+    void info(Supplier<?> msgSupplier);
+
+    /**
+     * Logs a message (only to be constructed if the logging level is the {@link Level#INFO INFO} level) including the
+     * stack trace of the {@link Throwable} <code>t</code> passed as parameter.
+     *
+     * @param msgSupplier A function, which when called, produces the desired log message; the format depends on the
+     *            message factory.
+     * @param t the exception to log, including its stack trace.
+     */
+    void info(Supplier<?> msgSupplier, Throwable t);
+
+    /**
+     * Logs a message which is only to be constructed if the logging level is the {@link Level#INFO INFO} level with the
+     * specified Marker.
+     *
+     * @param marker the marker data specific to this log statement
+     * @param msgSupplier A function, which when called, produces the desired log message; the format depends on the
+     *            message factory.
+     */
+    void info(Marker marker, Supplier<?> msgSupplier);
+
+    /**
+     * Logs a message (only to be constructed if the logging level is the {@link Level#INFO INFO} level) with the
+     * specified Marker and including the stack trace of the {@link Throwable} <code>t</code> passed as parameter.
+     *
+     * @param marker the marker data specific to this log statement
+     * @param msgSupplier A function, which when called, produces the desired log message; the format depends on the
+     *            message factory.
+     * @param t A Throwable or null.
+     */
+    void info(Marker marker, Supplier<?> msgSupplier, Throwable t);
+
+    /**
+     * Logs a message with parameters which are only to be constructed if the logging level is the {@link Level#INFO
+     * INFO} level.
+     *
+     * @param marker the marker data specific to this log statement
+     * @param message the message to log; the format depends on the message factory.
+     * @param paramSuppliers An array of functions, which when called, produce the desired log message parameters.
+     */
+    void info(Marker marker, String message, Supplier<?>... paramSuppliers);
+
+    /**
+     * Logs a message which is only to be constructed if the logging level is the {@link Level#INFO INFO} level with
+     * the specified Marker. 
+     * The {@code MessageSupplier} may or may not use the {@link MessageFactory} to construct the {@code Message}.
+     *
+     * @param marker the marker data specific to this log statement
+     * @param msgSupplier A function, which when called, produces the desired log message.
+     */
+    void info(Marker marker, MessageSupplier msgSupplier);
+
+    /**
+     * Logs a message (only to be constructed if the logging level is the {@link Level#INFO INFO} level) with the
+     * specified Marker and including the stack trace of the {@link Throwable} <code>t</code> passed as parameter.
+     * The {@code MessageSupplier} may or may not use the {@link MessageFactory} to construct the {@code Message}.
+     *
+     * @param marker the marker data specific to this log statement
+     * @param msgSupplier A function, which when called, produces the desired log message.
+     * @param t A Throwable or null.
+     */
+    void info(Marker marker, MessageSupplier msgSupplier, Throwable t);
+
+    /**
+     * Logs a message which is only to be constructed if the logging level is the {@link Level#INFO INFO} level.
+     * The {@code MessageSupplier} may or may not use the {@link MessageFactory} to construct the {@code Message}.
+     *
+     * @param msgSupplier A function, which when called, produces the desired log message.
+     */
+    void info(MessageSupplier msgSupplier);
+
+    /**
+     * Logs a message (only to be constructed if the logging level is the {@link Level#INFO INFO} level) including the
+     * stack trace of the {@link Throwable} <code>t</code> passed as parameter.
+     * The {@code MessageSupplier} may or may not use the {@link MessageFactory} to construct the {@code Message}.
+     *
+     * @param msgSupplier A function, which when called, produces the desired log message.
+     * @param t the exception to log, including its stack trace.
+     */
+    void info(MessageSupplier msgSupplier, Throwable t);
+
+    /**
+     * Logs a message with parameters which are only to be constructed if the logging level is the {@link Level#INFO
+     * INFO} level.
+     *
+     * @param message the message to log; the format depends on the message factory.
+     * @param paramSuppliers An array of functions, which when called, produce the desired log message parameters.
+     */
+    void info(String message, Supplier<?>... paramSuppliers);
+
+    /**
+     * Logs a message which is only to be constructed if the logging level is the specified level.
+     *
+     * @param level the logging level
+     * @param msgSupplier A function, which when called, produces the desired log message; the format depends on the
+     *            message factory.
+     */
+    void log(Level level, Supplier<?> msgSupplier);
+
+    /**
+     * Logs a message (only to be constructed if the logging level is the specified level) including the stack log of
+     * the {@link Throwable} <code>t</code> passed as parameter.
+     *
+     * @param level the logging level
+     * @param msgSupplier A function, which when called, produces the desired log message; the format depends on the
+     *            message factory.
+     * @param t the exception to log, including its stack log.
+     */
+    void log(Level level, Supplier<?> msgSupplier, Throwable t);
+
+    /**
+     * Logs a message (only to be constructed if the logging level is the specified level) with the specified Marker.
+     *
+     * @param level the logging level
+     * @param marker the marker data specific to this log statement
+     * @param msgSupplier A function, which when called, produces the desired log message; the format depends on the
+     *            message factory.
+     */
+    void log(Level level, Marker marker, Supplier<?> msgSupplier);
+
+    /**
+     * Logs a message (only to be constructed if the logging level is the specified level) with the specified Marker and
+     * including the stack log of the {@link Throwable} <code>t</code> passed as parameter.
+     *
+     * @param level the logging level
+     * @param marker the marker data specific to this log statement
+     * @param msgSupplier A function, which when called, produces the desired log message; the format depends on the
+     *            message factory.
+     * @param t A Throwable or null.
+     */
+    void log(Level level, Marker marker, Supplier<?> msgSupplier, Throwable t);
+
+    /**
+     * Logs a message with parameters which are only to be constructed if the logging level is the specified level.
+     *
+     * @param level the logging level
+     * @param marker the marker data specific to this log statement
+     * @param message the message to log; the format depends on the message factory.
+     * @param paramSuppliers An array of functions, which when called, produce the desired log message parameters.
+     */
+    void log(Level level, Marker marker, String message, Supplier<?>... paramSuppliers);
+
+    /**
+     * Logs a message which is only to be constructed if the logging level is the specified level with
+     * the specified Marker. 
+     * The {@code MessageSupplier} may or may not use the {@link MessageFactory} to construct the {@code Message}.
+     *
+     * @param level the logging level
+     * @param marker the marker data specific to this log statement
+     * @param msgSupplier A function, which when called, produces the desired log message.
+     */
+    void log(Level level, Marker marker, MessageSupplier msgSupplier);
+
+    /**
+     * Logs a message (only to be constructed if the logging level is the specified level) with the
+     * specified Marker and including the stack log of the {@link Throwable} <code>t</code> passed as parameter.
+     * The {@code MessageSupplier} may or may not use the {@link MessageFactory} to construct the {@code Message}.
+     *
+     * @param level the logging level
+     * @param marker the marker data specific to this log statement
+     * @param msgSupplier A function, which when called, produces the desired log message.
+     * @param t A Throwable or null.
+     */
+    void log(Level level, Marker marker, MessageSupplier msgSupplier, Throwable t);
+
+    /**
+     * Logs a message which is only to be constructed if the logging level is the specified level.
+     * The {@code MessageSupplier} may or may not use the {@link MessageFactory} to construct the {@code Message}.
+     *
+     * @param level the logging level
+     * @param msgSupplier A function, which when called, produces the desired log message.
+     */
+    void log(Level level, MessageSupplier msgSupplier);
+
+    /**
+     * Logs a message (only to be constructed if the logging level is the specified level) including the
+     * stack log of the {@link Throwable} <code>t</code> passed as parameter.
+     * The {@code MessageSupplier} may or may not use the {@link MessageFactory} to construct the {@code Message}.
+     *
+     * @param level the logging level
+     * @param msgSupplier A function, which when called, produces the desired log message.
+     * @param t the exception to log, including its stack log.
+     */
+    void log(Level level, MessageSupplier msgSupplier, Throwable t);
+
+    /**
+     * Logs a message with parameters which are only to be constructed if the logging level is the specified level.
+     *
+     * @param level the logging level
+     * @param message the message to log; the format depends on the message factory.
+     * @param paramSuppliers An array of functions, which when called, produce the desired log message parameters.
+     */
+    void log(Level level, String message, Supplier<?>... paramSuppliers);
+
+    /**
+     * Logs a message which is only to be constructed if the logging level is the {@link Level#TRACE TRACE} level.
+     *
+     * @param msgSupplier A function, which when called, produces the desired log message; the format depends on the
+     *            message factory.
+     */
+    void trace(Supplier<?> msgSupplier);
+
+    /**
+     * Logs a message (only to be constructed if the logging level is the {@link Level#TRACE TRACE} level) including the
+     * stack trace of the {@link Throwable} <code>t</code> passed as parameter.
+     *
+     * @param msgSupplier A function, which when called, produces the desired log message; the format depends on the
+     *            message factory.
+     * @param t the exception to log, including its stack trace.
+     */
+    void trace(Supplier<?> msgSupplier, Throwable t);
+
+    /**
+     * Logs a message which is only to be constructed if the logging level is the {@link Level#TRACE TRACE} level with
+     * the specified Marker.
+     *
+     * @param marker the marker data specific to this log statement
+     * @param msgSupplier A function, which when called, produces the desired log message; the format depends on the
+     *            message factory.
+     */
+    void trace(Marker marker, Supplier<?> msgSupplier);
+
+    /**
+     * Logs a message (only to be constructed if the logging level is the {@link Level#TRACE TRACE} level) with the
+     * specified Marker and including the stack trace of the {@link Throwable} <code>t</code> passed as parameter.
+     *
+     * @param marker the marker data specific to this log statement
+     * @param msgSupplier A function, which when called, produces the desired log message; the format depends on the
+     *            message factory.
+     * @param t A Throwable or null.
+     */
+    void trace(Marker marker, Supplier<?> msgSupplier, Throwable t);
+
+    /**
+     * Logs a message with parameters which are only to be constructed if the logging level is the {@link Level#TRACE
+     * TRACE} level.
+     *
+     * @param marker the marker data specific to this log statement
+     * @param message the message to log; the format depends on the message factory.
+     * @param paramSuppliers An array of functions, which when called, produce the desired log message parameters.
+     */
+    void trace(Marker marker, String message, Supplier<?>... paramSuppliers);
+
+    /**
+     * Logs a message which is only to be constructed if the logging level is the {@link Level#TRACE TRACE} level with
+     * the specified Marker. 
+     * The {@code MessageSupplier} may or may not use the {@link MessageFactory} to construct the {@code Message}.
+     *
+     * @param marker the marker data specific to this log statement
+     * @param msgSupplier A function, which when called, produces the desired log message.
+     */
+    void trace(Marker marker, MessageSupplier msgSupplier);
+
+    /**
+     * Logs a message (only to be constructed if the logging level is the {@link Level#TRACE TRACE} level) with the
+     * specified Marker and including the stack trace of the {@link Throwable} <code>t</code> passed as parameter.
+     * The {@code MessageSupplier} may or may not use the {@link MessageFactory} to construct the {@code Message}.
+     *
+     * @param marker the marker data specific to this log statement
+     * @param msgSupplier A function, which when called, produces the desired log message.
+     * @param t A Throwable or null.
+     */
+    void trace(Marker marker, MessageSupplier msgSupplier, Throwable t);
+
+    /**
+     * Logs a message which is only to be constructed if the logging level is the {@link Level#TRACE TRACE} level.
+     * The {@code MessageSupplier} may or may not use the {@link MessageFactory} to construct the {@code Message}.
+     *
+     * @param msgSupplier A function, which when called, produces the desired log message.
+     */
+    void trace(MessageSupplier msgSupplier);
+
+    /**
+     * Logs a message (only to be constructed if the logging level is the {@link Level#TRACE TRACE} level) including the
+     * stack trace of the {@link Throwable} <code>t</code> passed as parameter.
+     * The {@code MessageSupplier} may or may not use the {@link MessageFactory} to construct the {@code Message}.
+     *
+     * @param msgSupplier A function, which when called, produces the desired log message.
+     * @param t the exception to log, including its stack trace.
+     */
+    void trace(MessageSupplier msgSupplier, Throwable t);
+
+    /**
+     * Logs a message with parameters which are only to be constructed if the logging level is the {@link Level#TRACE
+     * TRACE} level.
+     *
+     * @param message the message to log; the format depends on the message factory.
+     * @param paramSuppliers An array of functions, which when called, produce the desired log message parameters.
+     */
+    void trace(String message, Supplier<?>... paramSuppliers);
+
+    /**
+     * Logs a message which is only to be constructed if the logging level is the {@link Level#WARN WARN} level.
+     *
+     * @param msgSupplier A function, which when called, produces the desired log message; the format depends on the
+     *            message factory.
+     */
+    void warn(Supplier<?> msgSupplier);
+
+    /**
+     * Logs a message (only to be constructed if the logging level is the {@link Level#WARN WARN} level) including the
+     * stack warn of the {@link Throwable} <code>t</code> passed as parameter.
+     *
+     * @param msgSupplier A function, which when called, produces the desired log message; the format depends on the
+     *            message factory.
+     * @param t the exception to log, including its stack warn.
+     */
+    void warn(Supplier<?> msgSupplier, Throwable t);
+
+    /**
+     * Logs a message which is only to be constructed if the logging level is the {@link Level#WARN WARN} level with the
+     * specified Marker.
+     *
+     * @param marker the marker data specific to this log statement
+     * @param msgSupplier A function, which when called, produces the desired log message; the format depends on the
+     *            message factory.
+     */
+    void warn(Marker marker, Supplier<?> msgSupplier);
+
+    /**
+     * Logs a message (only to be constructed if the logging level is the {@link Level#WARN WARN} level) with the
+     * specified Marker and including the stack warn of the {@link Throwable} <code>t</code> passed as parameter.
+     *
+     * @param marker the marker data specific to this log statement
+     * @param msgSupplier A function, which when called, produces the desired log message; the format depends on the
+     *            message factory.
+     * @param t A Throwable or null.
+     */
+    void warn(Marker marker, Supplier<?> msgSupplier, Throwable t);
+
+    /**
+     * Logs a message with parameters which are only to be constructed if the logging level is the {@link Level#WARN
+     * WARN} level.
+     *
+     * @param marker the marker data specific to this log statement
+     * @param message the message to log; the format depends on the message factory.
+     * @param paramSuppliers An array of functions, which when called, produce the desired log message parameters.
+     */
+    void warn(Marker marker, String message, Supplier<?>... paramSuppliers);
+
+    /**
+     * Logs a message which is only to be constructed if the logging level is the {@link Level#WARN WARN} level with
+     * the specified Marker. 
+     * The {@code MessageSupplier} may or may not use the {@link MessageFactory} to construct the {@code Message}.
+     *
+     * @param marker the marker data specific to this log statement
+     * @param msgSupplier A function, which when called, produces the desired log message.
+     */
+    void warn(Marker marker, MessageSupplier msgSupplier);
+
+    /**
+     * Logs a message (only to be constructed if the logging level is the {@link Level#WARN WARN} level) with the
+     * specified Marker and including the stack warn of the {@link Throwable} <code>t</code> passed as parameter.
+     * The {@code MessageSupplier} may or may not use the {@link MessageFactory} to construct the {@code Message}.
+     *
+     * @param marker the marker data specific to this log statement
+     * @param msgSupplier A function, which when called, produces the desired log message.
+     * @param t A Throwable or null.
+     */
+    void warn(Marker marker, MessageSupplier msgSupplier, Throwable t);
+
+    /**
+     * Logs a message which is only to be constructed if the logging level is the {@link Level#WARN WARN} level.
+     * The {@code MessageSupplier} may or may not use the {@link MessageFactory} to construct the {@code Message}.
+     *
+     * @param msgSupplier A function, which when called, produces the desired log message.
+     */
+    void warn(MessageSupplier msgSupplier);
+
+    /**
+     * Logs a message (only to be constructed if the logging level is the {@link Level#WARN WARN} level) including the
+     * stack warn of the {@link Throwable} <code>t</code> passed as parameter.
+     * The {@code MessageSupplier} may or may not use the {@link MessageFactory} to construct the {@code Message}.
+     *
+     * @param msgSupplier A function, which when called, produces the desired log message.
+     * @param t the exception to log, including its stack warn.
+     */
+    void warn(MessageSupplier msgSupplier, Throwable t);
+
+    /**
+     * Logs a message with parameters which are only to be constructed if the logging level is the {@link Level#WARN
+     * WARN} level.
+     *
+     * @param message the message to log; the format depends on the message factory.
+     * @param paramSuppliers An array of functions, which when called, produce the desired log message parameters.
+     */
+    void warn(String message, Supplier<?>... paramSuppliers);
+
+}