You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@logging.apache.org by Ralph Goers <ra...@dslextreme.com> on 2018/07/02 00:03:15 UTC

Re: logging-log4j2 git commit: LOG4J2-2362 ReusableObjectMessage memory leak

This commit is broken. There were merge conflicts in changes.xml that were not properly resolved. Please fix this asap.

Ralph


> On Jun 29, 2018, at 7:53 PM, ckozak@apache.org wrote:
> 
> Repository: logging-log4j2
> Updated Branches:
>  refs/heads/release-2.x b66f09c34 -> 377afa006
> 
> 
> LOG4J2-2362 ReusableObjectMessage memory leak
> 
> ReusableObjectMessage would previously retain a reference to
> the most recently logged object.
> 
> 
> Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
> Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/377afa00
> Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/377afa00
> Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/377afa00
> 
> Branch: refs/heads/release-2.x
> Commit: 377afa006b5102c508f1e6578bc05da24385907f
> Parents: b66f09c
> Author: Carter Kozak <ck...@apache.org>
> Authored: Fri Jun 29 16:02:55 2018 -0400
> Committer: Carter Kozak <ck...@apache.org>
> Committed: Fri Jun 29 22:52:54 2018 -0400
> 
> ----------------------------------------------------------------------
> .../log4j/message/ReusableMessageFactory.java   |   2 +
> .../apache/logging/log4j/LambdaLoggerTest.java  |   5 +-
> .../core/EventParameterMemoryLeakTest.java      |  10 +-
> src/changes/changes.xml                         | 174 +++++++++++++++++++
> 4 files changed, 188 insertions(+), 3 deletions(-)
> ----------------------------------------------------------------------
> 
> 
> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/377afa00/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableMessageFactory.java
> ----------------------------------------------------------------------
> diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableMessageFactory.java b/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableMessageFactory.java
> index d75ca01..c258045 100644
> --- a/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableMessageFactory.java
> +++ b/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableMessageFactory.java
> @@ -86,6 +86,8 @@ public final class ReusableMessageFactory implements MessageFactory2, Serializab
>     public static void release(final Message message) { // LOG4J2-1583
>         if (message instanceof ReusableParameterizedMessage) {
>             ((ReusableParameterizedMessage) message).reserved = false;
> +        } else if (message instanceof ReusableObjectMessage) {
> +            ((ReusableObjectMessage) message).set(null);
>         }
>     }
> 
> 
> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/377afa00/log4j-api/src/test/java/org/apache/logging/log4j/LambdaLoggerTest.java
> ----------------------------------------------------------------------
> diff --git a/log4j-api/src/test/java/org/apache/logging/log4j/LambdaLoggerTest.java b/log4j-api/src/test/java/org/apache/logging/log4j/LambdaLoggerTest.java
> index f6d1623..b532171 100644
> --- a/log4j-api/src/test/java/org/apache/logging/log4j/LambdaLoggerTest.java
> +++ b/log4j-api/src/test/java/org/apache/logging/log4j/LambdaLoggerTest.java
> @@ -21,6 +21,7 @@ import java.util.ArrayList;
> import java.util.List;
> 
> import org.apache.logging.log4j.message.Message;
> +import org.apache.logging.log4j.message.ReusableMessage;
> import org.apache.logging.log4j.message.SimpleMessage;
> import org.apache.logging.log4j.spi.AbstractLogger;
> import org.apache.logging.log4j.util.Supplier;
> @@ -46,7 +47,9 @@ public class LambdaLoggerTest {
>             this.fqcn = fqcn;
>             this.level = level;
>             this.marker = marker;
> -            this.message = message;
> +            this.message = (message instanceof ReusableMessage) ?
> +                    ((ReusableMessage) message).memento() :
> +                    message;
>             this.throwable = t;
>         }
>     }
> 
> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/377afa00/log4j-core/src/test/java/org/apache/logging/log4j/core/EventParameterMemoryLeakTest.java
> ----------------------------------------------------------------------
> diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/EventParameterMemoryLeakTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/EventParameterMemoryLeakTest.java
> index de99eef..d2106f9 100644
> --- a/log4j-core/src/test/java/org/apache/logging/log4j/core/EventParameterMemoryLeakTest.java
> +++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/EventParameterMemoryLeakTest.java
> @@ -49,21 +49,27 @@ public class EventParameterMemoryLeakTest {
>     }
> 
>     @Test
> +    @SuppressWarnings("UnusedAssignment") // parameter set to null to allow garbage collection
>     public void testParametersAreNotLeaked() throws Exception {
>         final File file = new File("target", "EventParameterMemoryLeakTest.log");
>         assertTrue("Deleted old file before test", !file.exists() || file.delete());
> 
>         final Logger log = LogManager.getLogger("com.foo.Bar");
>         CountDownLatch latch = new CountDownLatch(1);
> -        log.info("Message with parameter {}", new ParameterObject("paramValue", latch));
> +        Object parameter = new ParameterObject("paramValue", latch);
> +        log.info("Message with parameter {}", parameter);
> +        log.info(parameter);
> +        parameter = null;
>         CoreLoggerContexts.stopLoggerContext(file);
>         final BufferedReader reader = new BufferedReader(new FileReader(file));
>         final String line1 = reader.readLine();
>         final String line2 = reader.readLine();
> +        final String line3 = reader.readLine();
>         reader.close();
>         file.delete();
>         assertThat(line1, containsString("Message with parameter paramValue"));
> -        assertNull("Expected only a single line", line2);
> +        assertThat(line2, containsString("paramValue"));
> +        assertNull("Expected only a two lines", line3);
>         GarbageCollectionHelper gcHelper = new GarbageCollectionHelper();
>         gcHelper.run();
>         try {
> 
> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/377afa00/src/changes/changes.xml
> ----------------------------------------------------------------------
> diff --git a/src/changes/changes.xml b/src/changes/changes.xml
> index d9e0790..9fab226 100644
> --- a/src/changes/changes.xml
> +++ b/src/changes/changes.xml
> @@ -30,6 +30,177 @@
>          - "update" - Change
>          - "remove" - Removed
>     -->
> +<<<<<<< HEAD
> +=======
> +    <release version="3.0.0" date="2018-xx-xx" description="GA Release 3.0.0">
> +      <action issue="LOG4J2-2171" dev="rmannibucau" type="add">
> +        Allow to force LOG4J2 to use TCCL only.
> +      </action>
> +      <action issue="LOG4J2-1802" dev="mattsicker" type="add">
> +        Convert documentation into AsciiDoc format.
> +      </action>
> +      <action issue="LOG4J2-2268" dev="rgoers" type="fix" due-to="Tilman Hausherr">
> +        Improve plugin error message when elements are missing.
> +      </action>
> +      <action issue="LOG4J2-2255" dev="rgoers" type="update">
> +        Use Spotbugs instead of Findbugs. Minimum version is Java 8.
> +      </action>
> +      <action issue="LOG4J2-2224" dev="rpopma" type="update">
> +        Renamed package core.util.datetime to core.time.internal.format to clarify these classes are to be considered private.
> +      </action>
> +      <action issue="LOG4J2-2225" dev="rpopma" type="update">
> +        Moved time-related classes from core.util to core.time. Classes considered private moved to core.time.internal.
> +      </action>
> +      <action issue="LOG4J2-2228" dev="ggregory" type="update" due-to="Gary Gregory">
> +        Split off ZeroMq/JeroMq support into a new module log4j-jeromq.
> +      </action>
> +      <action issue="LOG4J2-2227" dev="ggregory" type="update" due-to="Gary Gregory">
> +        Split off Kafka support into a new module log4j-kafka.
> +      </action>
> +      <action issue="LOG4J2-2230" dev="ggregory" type="update" due-to="Gary Gregory">
> +        Split off SMTP support into a new module log4j-smtp.
> +      </action>
> +      <action issue="LOG4J2-2231" dev="ggregory" type="update" due-to="Gary Gregory">
> +        Move CSV layout from log4j-core to a new module log4j-csv.
> +      </action>
> +      <action issue="LOG4J2-2232" dev="ggregory" type="update" due-to="Gary Gregory">
> +        Move JMS code to a new module log4j-jms.
> +      </action>
> +      <action issue="LOG4J2-2233" dev="ggregory" type="update" due-to="Gary Gregory">
> +        Move JDBC code to a new module log4j-jdbc.
> +      </action>
> +      <action issue="LOG4J2-2244" dev="ggregory" type="fix" due-to="Gary Gregory">
> +        org.apache.logging.log4j.core.lookup.EnvironmentLookup may throw NPE.
> +      </action>
> +      <action issue="LOG4J2-2237" dev="ggregory" type="update" due-to="Gary Gregory">
> +        Move Jackson-based layouts to their own modules: JSON, XML, and YAML.
> +      </action>
> +      <action issue="LOG4J2-2082" dev="ggregory" type="update" due-to="Gary Gregory">
> +        Update Apache Flume from 1.7.0 to 1.8.0.
> +      </action>
> +      <action issue="LOG4J2-2079" dev="ggregory" type="update" due-to="Gary Gregory">
> +        Update Conversant Disruptor from 1.12.10 to 1.12.11.
> +      </action>
> +      <action issue="LOG4J2-2258" dev="ggregory" type="update" due-to="Gary Gregory">
> +        Update LMAX Disruptor from 3.3.7 to 3.3.8.
> +      </action>
> +      <action issue="LOG4J2-2083" dev="ggregory" type="update" due-to="Gary Gregory">
> +        Update Eclipse javax.persistence from 2.1.1 to 2.2.0.
> +      </action>
> +      <action issue="LOG4J2-2083" dev="ggregory" type="update">
> +        Update build to expect Java 8 sources and generate Java 8 byte codes.
> +      </action>
> +      <action issue="LOG4J2-2259" dev="ggregory" type="update">
> +        Update MongoDB 3 module from driver 3.6.1 to 3.6.3.
> +      </action>
> +      <action issue="LOG4J2-2260" dev="ggregory" type="update">
> +        [SMTP] Update javax.mail from 1.6.0 to 1.6.1.
> +      </action>
> +      <action issue="LOG4J2-2270" dev="ggregory" type="fix" due-to="Cyril Martin">
> +        Strings::join, when called with [null] returns "null" instead of EMPTY.
> +      </action>
> +      <action issue="LOG4J2-2276" dev="ggregory" type="fix" due-to="Sean Baxter">
> +        ConcurrentModificationException from org.apache.logging.log4j.status.StatusLogger.&lt;clinit>(StatusLogger.java:71).
> +      </action>
> +      <action issue="LOG4J2-2274" dev="ggregory" type="fix" due-to="Sebastien Lannez">
> +        Allow EnvironmentPropertySource to run with a SecurityManager that rejects environment variable access.
> +      </action>
> +      <action issue="LOG4J2-2279" dev="ggregory" type="fix" due-to="Gary Gregory">
> +        Allow SystemPropertiesPropertySource to run with a SecurityManager that rejects system property access.
> +      </action>
> +      <action issue="LOG4J2-2279" dev="ggregory" type="fix" due-to="Remko Popma">
> +        Move ProcessIdUtil from log4j-api to log4j-core.
> +      </action>
> +      <action issue="LOG4J2-2283" dev="ggregory" type="fix" due-to="Vishnu Priya Matha">
> +        ParserConfigurationException when using Log4j with oracle.xml.jaxp.JXDocumentBuilderFactory.
> +      </action>
> +      <action issue="LOG4J2-2300" dev="ggregory" type="fix">
> +        PoolingDriverConnectionSource does not take into account properties, user name, and password.
> +      </action>
> +      <action issue="LOG4J2-2302" dev="ggregory" type="update">
> +        Status logger should show the Log4j name and version when initializing itself.
> +      </action>
> +      <action issue="LOG4J2-2304" dev="ggregory" type="update" due-to="wumengsheng">
> +        Log4j2 2.8.2 JMX unregister NullPointerException.
> +      </action>
> +      <action issue="LOG4J2-2306" dev="ckozak" type="fix">
> +        FixedDateFormat parses timezone offsets, -8:00 is interpreted as GMT-8:00.
> +      </action>
> +      <action issue="LOG4J2-2307" dev="ckozak" type="fix">
> +        MutableLogEvent and RingBufferLogEvent message mementos retain the original format string.
> +      </action>
> +      <action issue="LOG4J2-2032" dev="ckozak" type="fix" due-to="Kostiantyn Shchepanovskyi">
> +        Curly braces in parameters are not treated as placeholders.
> +      </action>
> +      <action issue="LOG4J2-2311" dev="ggregory" type="update">
> +        Update Jackson from 2.9.4 to 2.9.5.
> +      </action>
> +      <action issue="LOG4J2-2313" dev="ggregory" type="update">
> +        Update LMAX Disruptor from 3.3.8 to 3.4.2.
> +      </action>
> +      <action issue="LOG4J2-2317" dev="ckozak" type="fix">
> +        MutableLogEvent.getNonNullImmutableMessage and Log4jLogEvent.makeMessageImmutable retain format and parameters.
> +      </action>
> +      <action issue="LOG4J2-2318" dev="ckozak" type="fix">
> +        Messages are no longer mutated when the asynchronous queue is full. A warning is logged to the status logger instead.
> +      </action>
> +      <action issue="LOG4J2-2320" dev="ckozak" type="fix">
> +        Fix NPE in AbstractLogger when another exception is thrown, masking the root cause.
> +      </action>
> +      <action issue="LOG4J2-548" dev="ggregory" type="update" due-to="Shehata, Paresh Varke, Eric Victorson, Martin Laforet">
> +        Log4j 2.0 ERROR "Could not search jar" with JBoss EAP 6.2.
> +      </action>
> +      <action issue="LOG4J2-2321" dev="ckozak" type="fix">
> +        AsyncLogger uses the correct level when unspecified. This provides parity between AsyncLogger and Logger.
> +      </action>
> +      <action issue="LOG4J2-2322" dev="ckozak" type="fix">
> +        Custom ContextSelector implementations which select an AsyncLoggerContext disable LoggerConfig.includeLocation
> +        by default for parity with AsyncLoggerContextSelector.
> +      </action>
> +      <action issue="LOG4J2-2269" dev="ckozak" type="fix">
> +        MutableLogEvent references to other objects are cleared after each use.
> +        Fix a memory leak causing references to parameters to be held after synchronous logging with thread locals enabled.
> +      </action>
> +      <action issue="LOG4J2-2328" dev="ggregory" type="update">
> +        Update JAnsi from 1.17 to 1.17.1.
> +      </action>
> +      <action issue="LOG4J2-2301" dev="ckozak" type="fix">
> +        Mixed async loggers no longer forget parameter values, providing some appenders with an array of nulls.
> +      </action>
> +      <action issue="LOG4J2-2331" dev="ckozak" type="fix" due-to="Mike Baranski">
> +        RollingFileManager debug logging avoids string concatenation and errant braces in favor of parameterized logging.
> +      </action>
> +      <action issue="LOG4J2-2333" dev="ckozak" type="fix">
> +        Handle errors thrown in default disruptor ExceptionHandler implementations to avoid killing background threads.
> +      </action>
> +      <action issue="LOG4J2-2334" dev="ggregory" type="fix">
> +        Add API org.apache.logging.log4j.core.appender.AsyncAppender.getQueueSize().
> +      </action>
> +      <action issue="LOG4J2-2336" dev="ckozak" type="fix">
> +        Remove duplicate hyphen from the AsyncLoggerConfig background thread name.
> +      </action>
> +      <action issue="LOG4J2-2347" dev="ggregory" type="fix">
> +        Update Apache Commons Compress from 1.16.1 to 1.17.
> +      </action>
> +      <action issue="LOG4J2-2351" dev="ckozak" type="update">
> +        Added AbstractLogEvent.getMutableInstant to allow the MutableInstant instance to be modified by classes extending AbstractLogEvent.
> +      </action>
> +      <action issue="LOG4J2-2352" dev="ckozak" type="fix">
> +        RingBufferLogEvent memento messages provide the expected format string, and no longer attempt to substitute parameters into curly braces in parameter toString values.
> +        Both RingBufferLogEvent and MutableLogEvent memento implementations memoize results to avoid rebuilding formatted string values.
> +      </action>
> +      <action issue="LOG4J2-2355" dev="ckozak" type="fix" due-to="Henrik Brautaset Aronsen">
> +        PropertiesUtil ignores non-string system properties. Fixes a NoClassDefFoundError initializing StatusLogger
> +        caused by an NPE while initializing the static PropertiesUtil field.
> +      </action>
> +      <action issue="LOG4J2-2357" dev="ggregory" type="update">
> +        Update Jackson from 2.9.5 to 2.9.6.
> +      </action>
> +      <action issue="LOG4J2-2362" dev="ckozak" type="fix">
> +        Fixed a memory leak in which ReusableObjectMessage would hold a reference to the most recently logged object.
> +      </action>
> +    </release>
> +>>>>>>> 063e725b8... LOG4J2-2362 ReusableObjectMessage memory leak
>     <release version="2.11.1" date="2018-MM-DD" description="GA Release 2.11.1">
>       <action issue="LOG4J2-2268" dev="rgoers" type="fix" due-to="Tilman Hausherr">
>         Improve plugin error message when elements are missing.
> @@ -119,6 +290,9 @@
>       <action issue="LOG4J2-2358" dev="ggregory" type="update">
>         Update Kafka client from 1.0.0 to 1.1.0.
>       </action>
> +      <action issue="LOG4J2-2362" dev="ckozak" type="fix">
> +        Fixed a memory leak in which ReusableObjectMessage would hold a reference to the most recently logged object.
> +      </action>
>     </release>
>     <release version="2.11.0" date="2018-03-11" description="GA Release 2.11.0">
>       <action issue="LOG4J2-2104" dev="rgoers" type="fix">
> 
> 



Re: logging-log4j2 git commit: LOG4J2-2362 ReusableObjectMessage memory leak

Posted by Carter Kozak <c4...@gmail.com>.
Sorry, fixed.

On Sun, Jul 1, 2018 at 8:03 PM, Ralph Goers <ra...@dslextreme.com> wrote:
> This commit is broken. There were merge conflicts in changes.xml that were not properly resolved. Please fix this asap.
>
> Ralph
>
>
>> On Jun 29, 2018, at 7:53 PM, ckozak@apache.org wrote:
>>
>> Repository: logging-log4j2
>> Updated Branches:
>>  refs/heads/release-2.x b66f09c34 -> 377afa006
>>
>>
>> LOG4J2-2362 ReusableObjectMessage memory leak
>>
>> ReusableObjectMessage would previously retain a reference to
>> the most recently logged object.
>>
>>
>> Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
>> Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/377afa00
>> Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/377afa00
>> Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/377afa00
>>
>> Branch: refs/heads/release-2.x
>> Commit: 377afa006b5102c508f1e6578bc05da24385907f
>> Parents: b66f09c
>> Author: Carter Kozak <ck...@apache.org>
>> Authored: Fri Jun 29 16:02:55 2018 -0400
>> Committer: Carter Kozak <ck...@apache.org>
>> Committed: Fri Jun 29 22:52:54 2018 -0400
>>
>> ----------------------------------------------------------------------
>> .../log4j/message/ReusableMessageFactory.java   |   2 +
>> .../apache/logging/log4j/LambdaLoggerTest.java  |   5 +-
>> .../core/EventParameterMemoryLeakTest.java      |  10 +-
>> src/changes/changes.xml                         | 174 +++++++++++++++++++
>> 4 files changed, 188 insertions(+), 3 deletions(-)
>> ----------------------------------------------------------------------
>>
>>
>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/377afa00/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableMessageFactory.java
>> ----------------------------------------------------------------------
>> diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableMessageFactory.java b/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableMessageFactory.java
>> index d75ca01..c258045 100644
>> --- a/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableMessageFactory.java
>> +++ b/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableMessageFactory.java
>> @@ -86,6 +86,8 @@ public final class ReusableMessageFactory implements MessageFactory2, Serializab
>>     public static void release(final Message message) { // LOG4J2-1583
>>         if (message instanceof ReusableParameterizedMessage) {
>>             ((ReusableParameterizedMessage) message).reserved = false;
>> +        } else if (message instanceof ReusableObjectMessage) {
>> +            ((ReusableObjectMessage) message).set(null);
>>         }
>>     }
>>
>>
>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/377afa00/log4j-api/src/test/java/org/apache/logging/log4j/LambdaLoggerTest.java
>> ----------------------------------------------------------------------
>> diff --git a/log4j-api/src/test/java/org/apache/logging/log4j/LambdaLoggerTest.java b/log4j-api/src/test/java/org/apache/logging/log4j/LambdaLoggerTest.java
>> index f6d1623..b532171 100644
>> --- a/log4j-api/src/test/java/org/apache/logging/log4j/LambdaLoggerTest.java
>> +++ b/log4j-api/src/test/java/org/apache/logging/log4j/LambdaLoggerTest.java
>> @@ -21,6 +21,7 @@ import java.util.ArrayList;
>> import java.util.List;
>>
>> import org.apache.logging.log4j.message.Message;
>> +import org.apache.logging.log4j.message.ReusableMessage;
>> import org.apache.logging.log4j.message.SimpleMessage;
>> import org.apache.logging.log4j.spi.AbstractLogger;
>> import org.apache.logging.log4j.util.Supplier;
>> @@ -46,7 +47,9 @@ public class LambdaLoggerTest {
>>             this.fqcn = fqcn;
>>             this.level = level;
>>             this.marker = marker;
>> -            this.message = message;
>> +            this.message = (message instanceof ReusableMessage) ?
>> +                    ((ReusableMessage) message).memento() :
>> +                    message;
>>             this.throwable = t;
>>         }
>>     }
>>
>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/377afa00/log4j-core/src/test/java/org/apache/logging/log4j/core/EventParameterMemoryLeakTest.java
>> ----------------------------------------------------------------------
>> diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/EventParameterMemoryLeakTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/EventParameterMemoryLeakTest.java
>> index de99eef..d2106f9 100644
>> --- a/log4j-core/src/test/java/org/apache/logging/log4j/core/EventParameterMemoryLeakTest.java
>> +++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/EventParameterMemoryLeakTest.java
>> @@ -49,21 +49,27 @@ public class EventParameterMemoryLeakTest {
>>     }
>>
>>     @Test
>> +    @SuppressWarnings("UnusedAssignment") // parameter set to null to allow garbage collection
>>     public void testParametersAreNotLeaked() throws Exception {
>>         final File file = new File("target", "EventParameterMemoryLeakTest.log");
>>         assertTrue("Deleted old file before test", !file.exists() || file.delete());
>>
>>         final Logger log = LogManager.getLogger("com.foo.Bar");
>>         CountDownLatch latch = new CountDownLatch(1);
>> -        log.info("Message with parameter {}", new ParameterObject("paramValue", latch));
>> +        Object parameter = new ParameterObject("paramValue", latch);
>> +        log.info("Message with parameter {}", parameter);
>> +        log.info(parameter);
>> +        parameter = null;
>>         CoreLoggerContexts.stopLoggerContext(file);
>>         final BufferedReader reader = new BufferedReader(new FileReader(file));
>>         final String line1 = reader.readLine();
>>         final String line2 = reader.readLine();
>> +        final String line3 = reader.readLine();
>>         reader.close();
>>         file.delete();
>>         assertThat(line1, containsString("Message with parameter paramValue"));
>> -        assertNull("Expected only a single line", line2);
>> +        assertThat(line2, containsString("paramValue"));
>> +        assertNull("Expected only a two lines", line3);
>>         GarbageCollectionHelper gcHelper = new GarbageCollectionHelper();
>>         gcHelper.run();
>>         try {
>>
>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/377afa00/src/changes/changes.xml
>> ----------------------------------------------------------------------
>> diff --git a/src/changes/changes.xml b/src/changes/changes.xml
>> index d9e0790..9fab226 100644
>> --- a/src/changes/changes.xml
>> +++ b/src/changes/changes.xml
>> @@ -30,6 +30,177 @@
>>          - "update" - Change
>>          - "remove" - Removed
>>     -->
>> +<<<<<<< HEAD
>> +=======
>> +    <release version="3.0.0" date="2018-xx-xx" description="GA Release 3.0.0">
>> +      <action issue="LOG4J2-2171" dev="rmannibucau" type="add">
>> +        Allow to force LOG4J2 to use TCCL only.
>> +      </action>
>> +      <action issue="LOG4J2-1802" dev="mattsicker" type="add">
>> +        Convert documentation into AsciiDoc format.
>> +      </action>
>> +      <action issue="LOG4J2-2268" dev="rgoers" type="fix" due-to="Tilman Hausherr">
>> +        Improve plugin error message when elements are missing.
>> +      </action>
>> +      <action issue="LOG4J2-2255" dev="rgoers" type="update">
>> +        Use Spotbugs instead of Findbugs. Minimum version is Java 8.
>> +      </action>
>> +      <action issue="LOG4J2-2224" dev="rpopma" type="update">
>> +        Renamed package core.util.datetime to core.time.internal.format to clarify these classes are to be considered private.
>> +      </action>
>> +      <action issue="LOG4J2-2225" dev="rpopma" type="update">
>> +        Moved time-related classes from core.util to core.time. Classes considered private moved to core.time.internal.
>> +      </action>
>> +      <action issue="LOG4J2-2228" dev="ggregory" type="update" due-to="Gary Gregory">
>> +        Split off ZeroMq/JeroMq support into a new module log4j-jeromq.
>> +      </action>
>> +      <action issue="LOG4J2-2227" dev="ggregory" type="update" due-to="Gary Gregory">
>> +        Split off Kafka support into a new module log4j-kafka.
>> +      </action>
>> +      <action issue="LOG4J2-2230" dev="ggregory" type="update" due-to="Gary Gregory">
>> +        Split off SMTP support into a new module log4j-smtp.
>> +      </action>
>> +      <action issue="LOG4J2-2231" dev="ggregory" type="update" due-to="Gary Gregory">
>> +        Move CSV layout from log4j-core to a new module log4j-csv.
>> +      </action>
>> +      <action issue="LOG4J2-2232" dev="ggregory" type="update" due-to="Gary Gregory">
>> +        Move JMS code to a new module log4j-jms.
>> +      </action>
>> +      <action issue="LOG4J2-2233" dev="ggregory" type="update" due-to="Gary Gregory">
>> +        Move JDBC code to a new module log4j-jdbc.
>> +      </action>
>> +      <action issue="LOG4J2-2244" dev="ggregory" type="fix" due-to="Gary Gregory">
>> +        org.apache.logging.log4j.core.lookup.EnvironmentLookup may throw NPE.
>> +      </action>
>> +      <action issue="LOG4J2-2237" dev="ggregory" type="update" due-to="Gary Gregory">
>> +        Move Jackson-based layouts to their own modules: JSON, XML, and YAML.
>> +      </action>
>> +      <action issue="LOG4J2-2082" dev="ggregory" type="update" due-to="Gary Gregory">
>> +        Update Apache Flume from 1.7.0 to 1.8.0.
>> +      </action>
>> +      <action issue="LOG4J2-2079" dev="ggregory" type="update" due-to="Gary Gregory">
>> +        Update Conversant Disruptor from 1.12.10 to 1.12.11.
>> +      </action>
>> +      <action issue="LOG4J2-2258" dev="ggregory" type="update" due-to="Gary Gregory">
>> +        Update LMAX Disruptor from 3.3.7 to 3.3.8.
>> +      </action>
>> +      <action issue="LOG4J2-2083" dev="ggregory" type="update" due-to="Gary Gregory">
>> +        Update Eclipse javax.persistence from 2.1.1 to 2.2.0.
>> +      </action>
>> +      <action issue="LOG4J2-2083" dev="ggregory" type="update">
>> +        Update build to expect Java 8 sources and generate Java 8 byte codes.
>> +      </action>
>> +      <action issue="LOG4J2-2259" dev="ggregory" type="update">
>> +        Update MongoDB 3 module from driver 3.6.1 to 3.6.3.
>> +      </action>
>> +      <action issue="LOG4J2-2260" dev="ggregory" type="update">
>> +        [SMTP] Update javax.mail from 1.6.0 to 1.6.1.
>> +      </action>
>> +      <action issue="LOG4J2-2270" dev="ggregory" type="fix" due-to="Cyril Martin">
>> +        Strings::join, when called with [null] returns "null" instead of EMPTY.
>> +      </action>
>> +      <action issue="LOG4J2-2276" dev="ggregory" type="fix" due-to="Sean Baxter">
>> +        ConcurrentModificationException from org.apache.logging.log4j.status.StatusLogger.&lt;clinit>(StatusLogger.java:71).
>> +      </action>
>> +      <action issue="LOG4J2-2274" dev="ggregory" type="fix" due-to="Sebastien Lannez">
>> +        Allow EnvironmentPropertySource to run with a SecurityManager that rejects environment variable access.
>> +      </action>
>> +      <action issue="LOG4J2-2279" dev="ggregory" type="fix" due-to="Gary Gregory">
>> +        Allow SystemPropertiesPropertySource to run with a SecurityManager that rejects system property access.
>> +      </action>
>> +      <action issue="LOG4J2-2279" dev="ggregory" type="fix" due-to="Remko Popma">
>> +        Move ProcessIdUtil from log4j-api to log4j-core.
>> +      </action>
>> +      <action issue="LOG4J2-2283" dev="ggregory" type="fix" due-to="Vishnu Priya Matha">
>> +        ParserConfigurationException when using Log4j with oracle.xml.jaxp.JXDocumentBuilderFactory.
>> +      </action>
>> +      <action issue="LOG4J2-2300" dev="ggregory" type="fix">
>> +        PoolingDriverConnectionSource does not take into account properties, user name, and password.
>> +      </action>
>> +      <action issue="LOG4J2-2302" dev="ggregory" type="update">
>> +        Status logger should show the Log4j name and version when initializing itself.
>> +      </action>
>> +      <action issue="LOG4J2-2304" dev="ggregory" type="update" due-to="wumengsheng">
>> +        Log4j2 2.8.2 JMX unregister NullPointerException.
>> +      </action>
>> +      <action issue="LOG4J2-2306" dev="ckozak" type="fix">
>> +        FixedDateFormat parses timezone offsets, -8:00 is interpreted as GMT-8:00.
>> +      </action>
>> +      <action issue="LOG4J2-2307" dev="ckozak" type="fix">
>> +        MutableLogEvent and RingBufferLogEvent message mementos retain the original format string.
>> +      </action>
>> +      <action issue="LOG4J2-2032" dev="ckozak" type="fix" due-to="Kostiantyn Shchepanovskyi">
>> +        Curly braces in parameters are not treated as placeholders.
>> +      </action>
>> +      <action issue="LOG4J2-2311" dev="ggregory" type="update">
>> +        Update Jackson from 2.9.4 to 2.9.5.
>> +      </action>
>> +      <action issue="LOG4J2-2313" dev="ggregory" type="update">
>> +        Update LMAX Disruptor from 3.3.8 to 3.4.2.
>> +      </action>
>> +      <action issue="LOG4J2-2317" dev="ckozak" type="fix">
>> +        MutableLogEvent.getNonNullImmutableMessage and Log4jLogEvent.makeMessageImmutable retain format and parameters.
>> +      </action>
>> +      <action issue="LOG4J2-2318" dev="ckozak" type="fix">
>> +        Messages are no longer mutated when the asynchronous queue is full. A warning is logged to the status logger instead.
>> +      </action>
>> +      <action issue="LOG4J2-2320" dev="ckozak" type="fix">
>> +        Fix NPE in AbstractLogger when another exception is thrown, masking the root cause.
>> +      </action>
>> +      <action issue="LOG4J2-548" dev="ggregory" type="update" due-to="Shehata, Paresh Varke, Eric Victorson, Martin Laforet">
>> +        Log4j 2.0 ERROR "Could not search jar" with JBoss EAP 6.2.
>> +      </action>
>> +      <action issue="LOG4J2-2321" dev="ckozak" type="fix">
>> +        AsyncLogger uses the correct level when unspecified. This provides parity between AsyncLogger and Logger.
>> +      </action>
>> +      <action issue="LOG4J2-2322" dev="ckozak" type="fix">
>> +        Custom ContextSelector implementations which select an AsyncLoggerContext disable LoggerConfig.includeLocation
>> +        by default for parity with AsyncLoggerContextSelector.
>> +      </action>
>> +      <action issue="LOG4J2-2269" dev="ckozak" type="fix">
>> +        MutableLogEvent references to other objects are cleared after each use.
>> +        Fix a memory leak causing references to parameters to be held after synchronous logging with thread locals enabled.
>> +      </action>
>> +      <action issue="LOG4J2-2328" dev="ggregory" type="update">
>> +        Update JAnsi from 1.17 to 1.17.1.
>> +      </action>
>> +      <action issue="LOG4J2-2301" dev="ckozak" type="fix">
>> +        Mixed async loggers no longer forget parameter values, providing some appenders with an array of nulls.
>> +      </action>
>> +      <action issue="LOG4J2-2331" dev="ckozak" type="fix" due-to="Mike Baranski">
>> +        RollingFileManager debug logging avoids string concatenation and errant braces in favor of parameterized logging.
>> +      </action>
>> +      <action issue="LOG4J2-2333" dev="ckozak" type="fix">
>> +        Handle errors thrown in default disruptor ExceptionHandler implementations to avoid killing background threads.
>> +      </action>
>> +      <action issue="LOG4J2-2334" dev="ggregory" type="fix">
>> +        Add API org.apache.logging.log4j.core.appender.AsyncAppender.getQueueSize().
>> +      </action>
>> +      <action issue="LOG4J2-2336" dev="ckozak" type="fix">
>> +        Remove duplicate hyphen from the AsyncLoggerConfig background thread name.
>> +      </action>
>> +      <action issue="LOG4J2-2347" dev="ggregory" type="fix">
>> +        Update Apache Commons Compress from 1.16.1 to 1.17.
>> +      </action>
>> +      <action issue="LOG4J2-2351" dev="ckozak" type="update">
>> +        Added AbstractLogEvent.getMutableInstant to allow the MutableInstant instance to be modified by classes extending AbstractLogEvent.
>> +      </action>
>> +      <action issue="LOG4J2-2352" dev="ckozak" type="fix">
>> +        RingBufferLogEvent memento messages provide the expected format string, and no longer attempt to substitute parameters into curly braces in parameter toString values.
>> +        Both RingBufferLogEvent and MutableLogEvent memento implementations memoize results to avoid rebuilding formatted string values.
>> +      </action>
>> +      <action issue="LOG4J2-2355" dev="ckozak" type="fix" due-to="Henrik Brautaset Aronsen">
>> +        PropertiesUtil ignores non-string system properties. Fixes a NoClassDefFoundError initializing StatusLogger
>> +        caused by an NPE while initializing the static PropertiesUtil field.
>> +      </action>
>> +      <action issue="LOG4J2-2357" dev="ggregory" type="update">
>> +        Update Jackson from 2.9.5 to 2.9.6.
>> +      </action>
>> +      <action issue="LOG4J2-2362" dev="ckozak" type="fix">
>> +        Fixed a memory leak in which ReusableObjectMessage would hold a reference to the most recently logged object.
>> +      </action>
>> +    </release>
>> +>>>>>>> 063e725b8... LOG4J2-2362 ReusableObjectMessage memory leak
>>     <release version="2.11.1" date="2018-MM-DD" description="GA Release 2.11.1">
>>       <action issue="LOG4J2-2268" dev="rgoers" type="fix" due-to="Tilman Hausherr">
>>         Improve plugin error message when elements are missing.
>> @@ -119,6 +290,9 @@
>>       <action issue="LOG4J2-2358" dev="ggregory" type="update">
>>         Update Kafka client from 1.0.0 to 1.1.0.
>>       </action>
>> +      <action issue="LOG4J2-2362" dev="ckozak" type="fix">
>> +        Fixed a memory leak in which ReusableObjectMessage would hold a reference to the most recently logged object.
>> +      </action>
>>     </release>
>>     <release version="2.11.0" date="2018-03-11" description="GA Release 2.11.0">
>>       <action issue="LOG4J2-2104" dev="rgoers" type="fix">
>>
>>
>
>