You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by ck...@apache.org on 2022/07/27 17:56:03 UTC

[logging-log4j2] branch release-2.x updated: LOG4J2-3560: Logger$PrivateConfig.filter(Level, Marker, String) varargs does not allocate (#974)

This is an automated email from the ASF dual-hosted git repository.

ckozak pushed a commit to branch release-2.x
in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git


The following commit(s) were added to refs/heads/release-2.x by this push:
     new f167c5198c LOG4J2-3560: Logger$PrivateConfig.filter(Level, Marker, String) varargs does not allocate (#974)
f167c5198c is described below

commit f167c5198c501466e84592be21082dbebf87f922
Author: David Schlosnagle <sc...@gmail.com>
AuthorDate: Wed Jul 27 13:55:56 2022 -0400

    LOG4J2-3560: Logger$PrivateConfig.filter(Level, Marker, String) varargs does not allocate (#974)
    
    Logger$PrivateConfig.filter(Level, Marker, String) varargs does not allocate
    The Filter interface provides a new default method matching the unrolled varargs
    method, with zero arguments.
---
 .../java/org/apache/logging/log4j/core/Filter.java | 13 +++
 .../java/org/apache/logging/log4j/core/Logger.java |  3 +-
 .../logging/log4j/core/GcFreeLoggingTestUtil.java  | 95 ++++++++++++++++++++--
 src/changes/changes.xml                            |  3 +
 4 files changed, 105 insertions(+), 9 deletions(-)

diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/Filter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/Filter.java
index 054d67b316..978dba49af 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/Filter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/Filter.java
@@ -20,6 +20,7 @@ package org.apache.logging.log4j.core;
 import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.Marker;
 import org.apache.logging.log4j.message.Message;
+import org.apache.logging.log4j.util.Constants;
 import org.apache.logging.log4j.util.EnglishEnums;
 
 /**
@@ -299,6 +300,18 @@ public interface Filter extends LifeCycle {
      */
     Result filter(Logger logger, Level level, Marker marker, Message msg, Throwable t);
 
+    /**
+     * Filter an event.
+     * @param logger The Logger.
+     * @param level The event logging Level.
+     * @param marker The Marker for the event or null.
+     * @param msg The Message
+     * @return the Result.
+     */
+    default Result filter(Logger logger, Level level, Marker marker, String msg) {
+        return filter(logger, level, marker, msg, Constants.EMPTY_OBJECT_ARRAY);
+    }
+
     /**
      * Filter an event.
      * @param event The Event to filter on.
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/Logger.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/Logger.java
index 6db76b2997..a6fbb0aab7 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/Logger.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/Logger.java
@@ -19,6 +19,7 @@ package org.apache.logging.log4j.core;
 import java.io.ObjectStreamException;
 import java.io.Serializable;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
@@ -299,7 +300,7 @@ public class Logger extends AbstractLogger implements Supplier<LoggerConfig> {
     public Iterator<Filter> getFilters() {
         final Filter filter = privateConfig.loggerConfig.getFilter();
         if (filter == null) {
-            return new ArrayList<Filter>().iterator();
+            return Collections.emptyIterator();
         } else if (filter instanceof CompositeFilter) {
             return ((CompositeFilter) filter).iterator();
         } else {
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/GcFreeLoggingTestUtil.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/GcFreeLoggingTestUtil.java
index f505fdbe99..f5df803843 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/GcFreeLoggingTestUtil.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/GcFreeLoggingTestUtil.java
@@ -18,6 +18,7 @@ package org.apache.logging.log4j.core;
 
 import com.google.monitoring.runtime.instrumentation.AllocationRecorder;
 import com.google.monitoring.runtime.instrumentation.Sampler;
+import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Marker;
 import org.apache.logging.log4j.MarkerManager;
@@ -57,6 +58,7 @@ public enum GcFreeLoggingTestUtil {;
         final Marker testGrandParent = MarkerManager.getMarker("testGrandParent");
         final Marker testParent = MarkerManager.getMarker("testParent").setParents(testGrandParent);
         final Marker test = MarkerManager.getMarker("test").setParents(testParent); // initial creation, value is cached
+        final StringMapMessage mapMessage = new StringMapMessage().with("eventId", "Login");
 
         // initialize LoggerContext etc.
         // This is not steady-state logging and will allocate objects.
@@ -69,6 +71,7 @@ public enum GcFreeLoggingTestUtil {;
         logger.error("Sample error message");
         logger.error("Test parameterized message {}", "param");
         logger.error(new StringMapMessage().with("eventId", "Login")); // initialize GelfLayout's messageStringBuilder
+        singleLoggingIteration(logger, myCharSeq, mapMessage);
         for (int i = 0; i < 256; i++) {
             logger.debug("ensure all ringbuffer slots have been used once"); // allocate MutableLogEvent.messageText
         }
@@ -100,7 +103,6 @@ public enum GcFreeLoggingTestUtil {;
             new RuntimeException().printStackTrace();
         };
         Thread.sleep(500);
-        final StringMapMessage mapMessage = new StringMapMessage().with("eventId", "Login");
         AllocationRecorder.addSampler(sampler);
 
         // now do some steady-state logging
@@ -110,13 +112,7 @@ public enum GcFreeLoggingTestUtil {;
 
         final int ITERATIONS = 5;
         for (int i = 0; i < ITERATIONS; i++) {
-            logger.error(myCharSeq);
-            logger.error(MarkerManager.getMarker("test"), myCharSeq);
-            logger.error("Test message");
-            logger.error("Test parameterized message {}", "param");
-            logger.error("Test parameterized message {}{}", "param", "param2");
-            logger.error("Test parameterized message {}{}{}", "param", "param2", "abc");
-            logger.error(mapMessage); // LOG4J2-1683
+            singleLoggingIteration(logger, myCharSeq, mapMessage);
             ThreadContext.remove("aKey");
             ThreadContext.put("aKey", "value1");
         }
@@ -126,6 +122,89 @@ public enum GcFreeLoggingTestUtil {;
         Thread.sleep(100);
     }
 
+    private static void singleLoggingIteration(
+            final org.apache.logging.log4j.Logger logger,
+            final MyCharSeq myCharSeq,
+            final StringMapMessage mapMessage) {
+        logger.isEnabled(Level.TRACE);
+        logger.isEnabled(Level.TRACE, MarkerManager.getMarker("test"));
+        logger.isTraceEnabled();
+        logger.isTraceEnabled(MarkerManager.getMarker("test"));
+        logger.trace(myCharSeq);
+        logger.trace(MarkerManager.getMarker("test"), myCharSeq);
+        logger.trace("Test message");
+        logger.trace("Test parameterized message {}", "param");
+        logger.trace("Test parameterized message {}{}", "param", "param2");
+        logger.trace("Test parameterized message {}{}{}", "param", "param2", "abc");
+        logger.trace(MarkerManager.getMarker("test"), "Test parameterized message {}{}{}", "param", "param2", "abc");
+        logger.trace(mapMessage); // LOG4J2-1683
+
+        logger.isEnabled(Level.DEBUG);
+        logger.isEnabled(Level.DEBUG, MarkerManager.getMarker("test"));
+        logger.isDebugEnabled();
+        logger.isDebugEnabled(MarkerManager.getMarker("test"));
+        logger.debug(myCharSeq);
+        logger.debug(MarkerManager.getMarker("test"), myCharSeq);
+        logger.debug("Test message");
+        logger.debug("Test parameterized message {}", "param");
+        logger.debug("Test parameterized message {}{}", "param", "param2");
+        logger.debug("Test parameterized message {}{}{}", "param", "param2", "abc");
+        logger.debug(MarkerManager.getMarker("test"), "Test parameterized message {}{}{}", "param", "param2", "abc");
+        logger.debug(mapMessage); // LOG4J2-1683
+
+        logger.isEnabled(Level.INFO);
+        logger.isEnabled(Level.INFO, MarkerManager.getMarker("test"));
+        logger.isInfoEnabled();
+        logger.isInfoEnabled(MarkerManager.getMarker("test"));
+        logger.info(myCharSeq);
+        logger.info(MarkerManager.getMarker("test"), myCharSeq);
+        logger.info("Test message");
+        logger.info("Test parameterized message {}", "param");
+        logger.info("Test parameterized message {}{}", "param", "param2");
+        logger.info("Test parameterized message {}{}{}", "param", "param2", "abc");
+        logger.info(MarkerManager.getMarker("test"), "Test parameterized message {}{}{}", "param", "param2", "abc");
+        logger.info(mapMessage); // LOG4J2-1683
+
+        logger.isEnabled(Level.WARN);
+        logger.isEnabled(Level.WARN, MarkerManager.getMarker("test"));
+        logger.isWarnEnabled();
+        logger.isWarnEnabled(MarkerManager.getMarker("test"));
+        logger.warn(myCharSeq);
+        logger.warn(MarkerManager.getMarker("test"), myCharSeq);
+        logger.warn("Test message");
+        logger.warn("Test parameterized message {}", "param");
+        logger.warn("Test parameterized message {}{}", "param", "param2");
+        logger.warn("Test parameterized message {}{}{}", "param", "param2", "abc");
+        logger.warn(MarkerManager.getMarker("test"), "Test parameterized message {}{}{}", "param", "param2", "abc");
+        logger.warn(mapMessage); // LOG4J2-1683
+
+        logger.isEnabled(Level.ERROR);
+        logger.isEnabled(Level.ERROR, MarkerManager.getMarker("test"));
+        logger.isErrorEnabled();
+        logger.isErrorEnabled(MarkerManager.getMarker("test"));
+        logger.error(myCharSeq);
+        logger.error(MarkerManager.getMarker("test"), myCharSeq);
+        logger.error("Test message");
+        logger.error("Test parameterized message {}", "param");
+        logger.error("Test parameterized message {}{}", "param", "param2");
+        logger.error("Test parameterized message {}{}{}", "param", "param2", "abc");
+        logger.error(MarkerManager.getMarker("test"), "Test parameterized message {}{}{}", "param", "param2", "abc");
+        logger.error(mapMessage); // LOG4J2-1683
+
+        logger.isEnabled(Level.FATAL);
+        logger.isEnabled(Level.FATAL, MarkerManager.getMarker("test"));
+        logger.isFatalEnabled();
+        logger.isFatalEnabled(MarkerManager.getMarker("test"));
+        logger.fatal(myCharSeq);
+        logger.fatal(MarkerManager.getMarker("test"), myCharSeq);
+        logger.fatal("Test message");
+        logger.fatal("Test parameterized message {}", "param");
+        logger.fatal("Test parameterized message {}{}", "param", "param2");
+        logger.fatal("Test parameterized message {}{}{}", "param", "param2", "abc");
+        logger.fatal(MarkerManager.getMarker("test"), "Test parameterized message {}{}{}", "param", "param2", "abc");
+        logger.fatal(mapMessage); // LOG4J2-1683
+    }
+
     public static void runTest(final Class<?> cls) throws Exception {
         final String javaHome = System.getProperty("java.home");
         final String javaBin = javaHome + File.separator + "bin" + File.separator + "java";
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index d42f88b1d8..2c6badad9b 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -33,6 +33,9 @@
       <action issue="LOG4J2-3550" dev="rgoers" type="fix" due-to="DongjianPeng">
         SystemPropertyAribiter was assigning the value as the name.
       </action>
+      <action issue="LOG4J2-3560" dev="ckozak" type="fix" due-to="David Schlosnagle">
+        Logger$PrivateConfig.filter(Level, Marker, String) was allocating empty varargs array.
+      </action>
     </release>
     <release version="2.18.0" date="2022-06-28" description="GA Release 2.18.0">
       <action issue="LOG4J2-3339" dev="rgoers" type="fix">