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">