Water Zheng created LOG4J2-3542:
-----------------------------------

             Summary: `ParameterizedMessage` formatted output incorrectly when 
nested
                 Key: LOG4J2-3542
                 URL: https://issues.apache.org/jira/browse/LOG4J2-3542
             Project: Log4j 2
          Issue Type: Bug
    Affects Versions: 2.17.2
         Environment: Dependencies:

implementation("org.apache.logging.log4j:log4j-core:2.17.2")
implementation("org.apache.logging.log4j:log4j-slf4j-impl:2.17.2")
implementation("org.slf4j:slf4j-api:1.7.36")

 
            Reporter: Water Zheng


`ParameterizedMessage` used a thread-local `StringBuilder` cache during format 
the message (#getFormattedMessage()), while the message arguments may called 
`ParameterizedMessage#getFormattedMessage()` again and caused the 
`threadLocalStringBuilder` reused nested.

 

 

The testcase code:
{code:java}
import org.apache.logging.log4j.message.ParameterizedMessage;
import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.assertEquals;

class TestLog4j2Message {
    @Test
    void testLog4j2ParameterizedMessage() {
        Object object = new Object() {
            @Override
            public String toString() {
                // return new FormattedMessage("test").getFormattedMessage();
                // see FormattedMessage.java#L200 (in method `#getMessage()` )
                String message = new 
ParameterizedMessage("test").getFormattedMessage();
                assertEquals("test", message);
                return message;
            }
        };
        // log("TEST nested format: {}", object);
        // see Log4jLogger.java#L371 (in method `#log(Marker, String, int, 
String, Object[], Throwable)` )
        String message = new ParameterizedMessage("TEST nested format: {}", 
object).getFormattedMessage();
        assertEquals("TEST nested format: test", message);
    }
}
  {code}
 

 

The output:

```

expected: <TEST nested format: test> but was: <testtest>
Expected :TEST nested format: test
Actual   :testtest

```



--
This message was sent by Atlassian Jira
(v8.20.7#820007)

Reply via email to