This is an automated email from the ASF dual-hosted git repository.
ckozak pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git
The following commit(s) were added to refs/heads/master by this push:
new d3f1f931a8 LOG4J2-3560: Logger$PrivateConfig.filter(Level, Marker,
String) varargs does not allocate (#974)
d3f1f931a8 is described below
commit d3f1f931a8ed75404b8c2c0bd5a302592ddc6444
Author: David Schlosnagle <[email protected]>
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 +-
.../log4j/gctests/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 cb34dc9da6..bd059be78c 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 979a7bd901..de55a52403 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;
@@ -292,7 +293,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-gctests/src/test/java/org/apache/logging/log4j/gctests/GcFreeLoggingTestUtil.java
b/log4j-gctests/src/test/java/org/apache/logging/log4j/gctests/GcFreeLoggingTestUtil.java
index a66e139ce9..b98120292f 100644
---
a/log4j-gctests/src/test/java/org/apache/logging/log4j/gctests/GcFreeLoggingTestUtil.java
+++
b/log4j-gctests/src/test/java/org/apache/logging/log4j/gctests/GcFreeLoggingTestUtil.java
@@ -18,6 +18,7 @@ package org.apache.logging.log4j.gctests;
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;
@@ -62,6 +63,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.
@@ -74,6 +76,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
}
@@ -108,7 +111,6 @@ public enum GcFreeLoggingTestUtil {;
}
};
Thread.sleep(500);
- final StringMapMessage mapMessage = new
StringMapMessage().with("eventId", "Login");
AllocationRecorder.addSampler(sampler);
// now do some steady-state logging
@@ -118,13 +120,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");
}
@@ -134,6 +130,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 = 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 2717752da6..49c2bfeb22 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -205,6 +205,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="20YY-06-28" description="GA Release
2.18.0">
<action issue="LOG4J2-3339" dev="rgoers" type="fix">