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)