@Test public void testCreateEventReturnsDifferentInstanceIfNotReleased() throws Exception { final ReusableMessageFactory factory = new ReusableMessageFactory(); final Message message1 = factory.newMessage("text, p0={} p1={} p2={} p3={}", 1, 2, 3, 4); final Message message2 = factory.newMessage("text, p0={} p1={} p2={} p3={}", 9, 8, 7, 6); assertNotSame(message1, message2); ReusableMessageFactory.release(message1); ReusableMessageFactory.release(message2); }
/** * Creates {@link ReusableObjectMessage} instances. * * @param message The message Object. * @return The Message. * * @see MessageFactory#newMessage(Object) */ @Override public Message newMessage(final Object message) { final ReusableObjectMessage result = getObject(); result.set(message); return result; } }
@Override public Message newMessage(final String message, final Object p0, final Object p1, final Object p2, final Object p3, final Object p4) { return getParameterized().set(message, p0, p1, p2, p3, p4); }
@Test public void testLayoutRingBufferEventReusableMessageWithCurlyBraces() throws Exception { final boolean propertiesAsList = false; final AbstractJacksonLayout layout = JsonLayout.newBuilder() .setLocationInfo(false) .setProperties(false) .setPropertiesAsList(propertiesAsList) .setComplete(false) .setCompact(true) .setEventEol(false) .setCharset(StandardCharsets.UTF_8) .setIncludeStacktrace(true) .build(); Message message = ReusableMessageFactory.INSTANCE.newMessage("Testing {}", new TestObj()); try { RingBufferLogEvent ringBufferEvent = new RingBufferLogEvent(); ringBufferEvent.setValues( null, "a.B", null, "f.q.c.n", Level.DEBUG, message, null, new SortedArrayStringMap(), ThreadContext.EMPTY_STACK, 1L, "threadName", 1, null, new SystemClock(), new DummyNanoClock()); final String str = layout.toSerializable(ringBufferEvent); final String expectedMessage = "Testing " + TestObj.TO_STRING_VALUE; assertThat(str, containsString("\"message\":\"" + expectedMessage + '"')); final Log4jLogEvent actual = new Log4jJsonObjectMapper(propertiesAsList, true, false, false).readValue(str, Log4jLogEvent.class); assertEquals(expectedMessage, actual.getMessage().getFormattedMessage()); } finally { ReusableMessageFactory.release(message); } }
@Test public void testCreateEventReturnsThreadLocalInstance() throws Exception { final ReusableMessageFactory factory = new ReusableMessageFactory(); final Message[] message1 = new Message[1]; final Message[] message2 = new Message[1]; new Integer(4), // }); ReusableMessageFactory.release(message1[0]); ReusableMessageFactory.release(message2[0]);
@PerformanceSensitive // NOTE: This is a hot method. Current implementation compiles to 30 bytes of byte code. // This is within the 35 byte MaxInlineSize threshold. Modify with care! private void logMessageSafely(final String fqcn, final Level level, final Marker marker, final Message msg, final Throwable throwable) { try { logMessageTrackRecursion(fqcn, level, marker, msg, throwable); } finally { // LOG4J2-1583 prevent scrambled logs when logging calls are nested (logging in toString()) ReusableMessageFactory.release(msg); } }
@Override public Message newMessage(final CharSequence charSequence) { final ReusableSimpleMessage result = getSimple(); result.set(charSequence); return result; }
@Override public void run() { message1[0] = factory.newMessage("text, p0={} p1={} p2={} p3={}", 1, 2, 3, 4); } };
.setIncludeStacktrace(true) .build(); Message message = ReusableMessageFactory.INSTANCE.newMessage("Testing {}", new TestObj()); try { final Log4jLogEvent expected = Log4jLogEvent.newBuilder() assertEquals(expectedMessage, actual.getMessage().getFormattedMessage()); } finally { ReusableMessageFactory.release(message);
@PerformanceSensitive // NOTE: This is a hot method. Current implementation compiles to 30 bytes of byte code. // This is within the 35 byte MaxInlineSize threshold. Modify with care! private void logMessageSafely(final String fqcn, final Level level, final Marker marker, final Message msg, final Throwable throwable) { try { tryLogMessage(fqcn, level, marker, msg, throwable); } finally { // LOG4J2-1583 prevent scrambled logs when logging calls are nested (logging in toString()) ReusableMessageFactory.release(msg); } }
/** * Creates {@link ReusableSimpleMessage} instances. * * @param message The message String. * @return The Message. * * @see MessageFactory#newMessage(String) */ @Override public Message newMessage(final String message) { final ReusableSimpleMessage result = getSimple(); result.set(message); return result; }
@Override public void run() { message2[0] = factory.newMessage("other, A={} B={} C={} D={}", 1, 2, 3, 4); } };
@Test public void testCreateEventReturnsSameInstance() throws Exception { final ReusableMessageFactory factory = new ReusableMessageFactory(); final Message message1 = factory.newMessage("text, p0={} p1={} p2={} p3={}", 1, 2, 3, 4); ReusableMessageFactory.release(message1); final Message message2 = factory.newMessage("text, p0={} p1={} p2={} p3={}", 9, 8, 7, 6); assertSame(message1, message2); ReusableMessageFactory.release(message2); final Message message3 = factory.newMessage("text, AAA={} BBB={} p2={} p3={}", 9, 8, 7, 6); assertSame(message2, message3); ReusableMessageFactory.release(message3); }
@Override public Message newMessage(final String message, final Object p0, final Object p1, final Object p2, final Object p3, final Object p4, final Object p5) { return getParameterized().set(message, p0, p1, p2, p3, p4, p5); }
@Override public Message newMessage(final CharSequence charSequence) { final ReusableSimpleMessage result = getSimple(); result.set(charSequence); return result; }
@Test public void testInitFromReusableCopiesFormatString() { Message message = ReusableMessageFactory.INSTANCE.newMessage("msg in a {}", "bottle"); final Log4jLogEvent source = Log4jLogEvent.newBuilder() //
/** * Creates {@link ReusableObjectMessage} instances. * * @param message The message Object. * @return The Message. * * @see MessageFactory#newMessage(Object) */ @Override public Message newMessage(final Object message) { final ReusableObjectMessage result = getObject(); result.set(message); return result; } }
@Test public void testCreateEventOverwritesFields() throws Exception { final ReusableMessageFactory factory = new ReusableMessageFactory(); final Message message1 = factory.newMessage("text, p0={} p1={} p2={} p3={}", 1, 2, 3, 4); assertReusableParameterizeMessage(message1, "text, p0={} p1={} p2={} p3={}", new Object[]{ new Integer(1), // new Integer(2), // new Integer(3), // new Integer(4), // }); ReusableMessageFactory.release(message1); final Message message2 = factory.newMessage("other, A={} B={} C={} D={}", 1, 2, 3, 4); assertReusableParameterizeMessage(message1, "other, A={} B={} C={} D={}", new Object[]{ new Integer(1), // new Integer(2), // new Integer(3), // new Integer(4), // }); assertSame(message1, message2); ReusableMessageFactory.release(message2); }
@Override public Message newMessage(final String message, final Object p0, final Object p1, final Object p2, final Object p3, final Object p4, final Object p5, final Object p6) { return getParameterized().set(message, p0, p1, p2, p3, p4, p5, p6); }
/** * Creates {@link ReusableSimpleMessage} instances. * * @param message The message String. * @return The Message. * * @see MessageFactory#newMessage(String) */ @Override public Message newMessage(final String message) { final ReusableSimpleMessage result = getSimple(); result.set(message); return result; }