@Override public void append(final LogEvent event) { final String serialized = ((AbstractStringLayout) getLayout()).toSerializable(event); if (logThrowables) { servletContext.log(serialized, event.getThrown()); } else { servletContext.log(serialized); } }
public static StringBuilder getStringBuilder() { return AbstractStringLayout.getStringBuilder(); }
@Override public String toSerializable(final LogEvent event) { final StringBuilder sb = getStringBuilder(); try { return toSerializable(event, sb).toString(); } finally { trimToMaxSize(sb); } }
/** * Formats the Log Event as a byte array. * * @param event The Log Event. * @return The formatted event as a byte array. */ @Override public byte[] toByteArray(final LogEvent event) { return getBytes(toSerializable(event)); }
protected byte[] serializeToBytes(final Serializer serializer, final byte[] defaultValue) { final String serializable = serializeToString(serializer); if (serializer == null) { return defaultValue; } return StringEncoder.toBytes(serializable, getCharset()); }
protected String serializeToString(final Serializer serializer) { if (serializer == null) { return null; } final LoggerConfig rootLogger = getConfiguration().getRootLogger(); // Using "" for the FQCN, does it matter? final LogEvent logEvent = getLogEventFactory().createEvent(rootLogger.getName(), null, Strings.EMPTY, rootLogger.getLevel(), null, null, null); return serializer.toSerializable(logEvent); }
/** * Returns the header, if one is available. * * @return A byte array containing the header. */ @Override public byte[] getHeader() { return serializeToBytes(headerSerializer, super.getHeader()); }
@Override public void encode(final LogEvent event, final ByteBufferDestination destination) { if (compressionType != CompressionType.OFF) { super.encode(event, destination); return; } final StringBuilder text = toText(event, getStringBuilder(), true); final Encoder<StringBuilder> helper = getStringBuilderEncoder(); helper.encode(text, destination); }
/** * Builds a new layout. * @param aCharset the charset used to encode the header bytes, footer bytes and anything else that needs to be * converted from strings to bytes. * @param header the header bytes * @param footer the footer bytes */ protected AbstractStringLayout(final Charset aCharset, final byte[] header, final byte[] footer) { super(null, header, footer); this.headerSerializer = null; this.footerSerializer = null; this.charset = aCharset == null ? StandardCharsets.UTF_8 : aCharset; this.charsetName = this.charset.name(); useCustomEncoding = isPreJava8() && (StandardCharsets.ISO_8859_1.equals(aCharset) || StandardCharsets.US_ASCII.equals(aCharset)); textEncoder = Constants.ENABLE_DIRECT_ENCODERS ? new StringBuilderEncoder(charset) : null; }
/** * Returns a {@code Encoder<StringBuilder>} that this Layout implementation can use for encoding log events. * * @return a {@code Encoder<StringBuilder>} */ protected Encoder<StringBuilder> getStringBuilderEncoder() { if (textEncoder == null) { textEncoder = new StringBuilderEncoder(getCharset()); } return textEncoder; }
@Override public String toSerializable(final LogEvent event) { final StringBuilder sb = getStringBuilder(); try { return toSerializable(event, sb).toString(); } finally { trimToMaxSize(sb); } }
/** * Returns the footer, if one is available. * * @return A byte array containing the footer. */ @Override public byte[] getFooter() { return serializeToBytes(footerSerializer, super.getFooter()); }
@Override public void encode(final LogEvent event, final ByteBufferDestination destination) { if (!(eventSerializer instanceof Serializer2)) { super.encode(event, destination); return; } final StringBuilder text = toText((Serializer2) eventSerializer, event, getStringBuilder()); final Encoder<StringBuilder> encoder = getStringBuilderEncoder(); encoder.encode(text, destination); trimToMaxSize(text); }
/** * Builds a new layout. * @param config the configuration * @param aCharset the charset used to encode the header bytes, footer bytes and anything else that needs to be * converted from strings to bytes. * @param headerSerializer the header bytes serializer * @param footerSerializer the footer bytes serializer */ protected AbstractStringLayout(final Configuration config, final Charset aCharset, final Serializer headerSerializer, final Serializer footerSerializer) { super(config, null, null); this.headerSerializer = headerSerializer; this.footerSerializer = footerSerializer; this.charset = aCharset == null ? StandardCharsets.UTF_8 : aCharset; this.charsetName = this.charset.name(); useCustomEncoding = isPreJava8() && (StandardCharsets.ISO_8859_1.equals(aCharset) || StandardCharsets.US_ASCII.equals(aCharset)); textEncoder = Constants.ENABLE_DIRECT_ENCODERS ? new StringBuilderEncoder(charset) : null; }
@Test public void nonMessageOnlyAbstractStringLayout() { // given ItemAppenderFactory factory = new ItemAppenderFactory(); String formattedIndexName = UUID.randomUUID().toString(); BatchDelivery batchDelivery = mock(BatchDelivery.class); AbstractStringLayout stringBasedLayout = mock(AbstractStringLayout.class); ItemAppender itemAppender = factory.createInstance(false, stringBasedLayout, batchDelivery); String expectedMessage = UUID.randomUUID().toString(); when(stringBasedLayout.toSerializable(any(LogEvent.class))).thenReturn(expectedMessage); LogEvent logEvent = createDefaultTestLogEvent(); // when itemAppender.append(formattedIndexName, logEvent); // then assertEquals(StringAppender.class, itemAppender.getClass()); verify(stringBasedLayout).toSerializable(logEventCaptor.capture()); assertEquals(logEvent, logEventCaptor.getValue()); verify(batchDelivery).add(indexNameCaptor.capture(), stringLogCaptor.capture()); assertEquals(formattedIndexName, indexNameCaptor.getValue()); assertEquals(expectedMessage, stringLogCaptor.getValue()); }
@Test public void messageOnlyAbstractStringLayout() { // given ItemAppenderFactory factory = new ItemAppenderFactory(); String formattedIndexName = UUID.randomUUID().toString(); BatchDelivery batchDelivery = mock(BatchDelivery.class); AbstractStringLayout abstractStringLayout = mock(AbstractStringLayout.class); ItemAppender itemAppender = factory.createInstance(true, abstractStringLayout, batchDelivery); String expectedMessage = UUID.randomUUID().toString(); LogEvent logEvent = mock(LogEvent.class); Message message = mock(Message.class); when(message.getFormattedMessage()).thenReturn(expectedMessage); when(logEvent.getMessage()).thenReturn(message); // when itemAppender.append(formattedIndexName, logEvent); // then assertEquals(StringAppender.class, itemAppender.getClass()); verify(abstractStringLayout, never()).toSerializable(any()); verify(batchDelivery).add(indexNameCaptor.capture(), stringLogCaptor.capture()); assertEquals(formattedIndexName, indexNameCaptor.getValue()); assertEquals(expectedMessage, stringLogCaptor.getValue()); }
@Test public void appenderUsesProvidedLayoutWhenMessageOnlyIsSetToFalse() { // given AbstractStringLayout layout = PowerMockito.mock(AbstractStringLayout.class); ElasticsearchAppender.Builder builder = ElasticsearchAppenderTest.createTestElasticsearchAppenderBuilder(); builder.withMessageOnly(false); builder.withLayout(layout); LogEvent logEvent = mock(LogEvent.class); ElasticsearchAppender appender = builder.build(); // when appender.append(logEvent); // then ArgumentCaptor<LogEvent> captor = ArgumentCaptor.forClass(LogEvent.class); verify(layout, times(1)).toSerializable(captor.capture()); assertEquals(logEvent, captor.getValue()); }