protected ItemAppenderFactory createItemAppenderFactory() { return new ItemAppenderFactory(); }
protected ElasticsearchAppender(String name, Filter filter, AbstractLayout layout, boolean ignoreExceptions, BatchDelivery batchDelivery, boolean messageOnly, IndexNameFormatter indexNameFormatter) { super(name, filter, layout, ignoreExceptions); this.indexNameFormatter = indexNameFormatter; this.itemAppender = createItemAppenderFactory().createInstance(messageOnly, layout, batchDelivery); }
@Test public void givenAbstractLayoutImplementingItemSourceLayoutDelegatesToItemSourceLayoutFactoryMethod() { // given ItemAppenderFactory factory = spy(new ItemAppenderFactory()); BatchDelivery batchDelivery = mock(BatchDelivery.class); ItemSourceLayout itemSourceLayout = spy(new TestItemSourceaLayout(mock(Configuration.class))); // when factory.createInstance(false, (AbstractLayout)itemSourceLayout, batchDelivery); // then verify(factory).createInstance(eq(false), eq(itemSourceLayout), eq(batchDelivery)); }
@Test public void unsupportedLayout() { // given ItemAppenderFactory factory = new ItemAppenderFactory(); expectedException.expect(ConfigurationException.class); expectedException.expectMessage("Unsupported layout"); // when factory.createInstance(false, mock(AbstractLayout.class), mock(BatchDelivery.class)); }
@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()); }
protected ElasticsearchAppender(String name, Filter filter, AbstractLayout layout, boolean ignoreExceptions, BatchDelivery batchDelivery, boolean messageOnly, IndexNameFormatter indexNameFormatter) { super(name, filter, layout, ignoreExceptions); this.indexNameFormatter = indexNameFormatter; this.itemAppender = createItemAppenderFactory().createInstance(messageOnly, layout, batchDelivery); }
protected ItemAppenderFactory createItemAppenderFactory() { return new ItemAppenderFactory(); }
@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()); }
/** * Creates {@link ItemAppender} instance with serializer selected based on given parameters * * @param messageOnly if true, {@link org.apache.logging.log4j.message.Message} will be serialized, * {@link org.apache.logging.log4j.core.LogEvent} otherwise * @param layout output formatter * @param batchDelivery serialization result consumer * @return configured {@link ItemAppender} */ public ItemAppender createInstance(boolean messageOnly, AbstractLayout layout, BatchDelivery batchDelivery) { if (layout instanceof ItemSourceLayout) { ItemSourceLayout itemSourceLayout = (ItemSourceLayout) layout; return createInstance(messageOnly, itemSourceLayout, batchDelivery); } if (messageOnly) { return new StringAppender(batchDelivery, logEvent -> logEvent.getMessage().getFormattedMessage()); } if (layout instanceof AbstractStringLayout) { AbstractStringLayout abstractStringLayout = (AbstractStringLayout) layout; return new StringAppender(batchDelivery, abstractStringLayout::toSerializable); } throw new ConfigurationException("Unsupported layout: " + layout.getClass()); }
@Test public void messageOnlyItemSourceLayout() { // given ItemAppenderFactory factory = new ItemAppenderFactory(); String formattedIndexName = UUID.randomUUID().toString(); BatchDelivery batchDelivery = mock(BatchDelivery.class); ItemSourceLayout itemSourceLayout = spy(new TestItemSourceaLayout(mock(Configuration.class))); ItemSourceAppender itemAppender = (ItemSourceAppender) factory.createInstance(true, (AbstractLayout)itemSourceLayout, batchDelivery); String expectedMessage = UUID.randomUUID().toString(); ItemSource itemSource = new StringItemSource(expectedMessage); when(itemSourceLayout.serialize(any(Message.class))).thenReturn(itemSource); LogEvent logEvent = mock(LogEvent.class); Message message = mock(Message.class); when(logEvent.getMessage()).thenReturn(message); // when itemAppender.append(formattedIndexName, logEvent); // then assertEquals(ItemSourceAppender.class, itemAppender.getClass()); verify(itemSourceLayout).serialize(messageCaptor.capture()); assertEquals(message, messageCaptor.getValue()); verify(batchDelivery).add(indexNameCaptor.capture(), itemSourceCaptor.capture()); assertEquals(formattedIndexName, indexNameCaptor.getValue()); assertEquals(expectedMessage, itemSourceCaptor.getValue().getSource()); }
/** * Creates {@link ItemAppender} instance with serializer selected based on given parameters * * @param messageOnly if true, {@link org.apache.logging.log4j.message.Message} will be serialized, * {@link org.apache.logging.log4j.core.LogEvent} otherwise * @param layout output formatter * @param batchDelivery serialization result consumer * @return configured {@link ItemAppender} */ public ItemAppender createInstance(boolean messageOnly, AbstractLayout layout, BatchDelivery batchDelivery) { if (layout instanceof ItemSourceLayout) { ItemSourceLayout itemSourceLayout = (ItemSourceLayout) layout; return createInstance(messageOnly, itemSourceLayout, batchDelivery); } if (messageOnly) { return new StringAppender(batchDelivery, logEvent -> logEvent.getMessage().getFormattedMessage()); } if (layout instanceof AbstractStringLayout) { AbstractStringLayout abstractStringLayout = (AbstractStringLayout) layout; return new StringAppender(batchDelivery, abstractStringLayout::toSerializable); } throw new ConfigurationException("Unsupported layout: " + layout.getClass()); }
@Test public void nonMessageOnlyItemSourceLayout() { // given ItemAppenderFactory factory = new ItemAppenderFactory(); String formattedIndexName = UUID.randomUUID().toString(); BatchDelivery batchDelivery = mock(BatchDelivery.class); ItemSourceLayout itemSourceLayout = spy(new TestItemSourceaLayout(mock(Configuration.class))); ItemSourceAppender itemAppender = (ItemSourceAppender) factory.createInstance(false, (AbstractLayout)itemSourceLayout, batchDelivery); String expectedMessage = UUID.randomUUID().toString(); ItemSource itemSource = new StringItemSource(expectedMessage); when(itemSourceLayout.serialize(any(LogEvent.class))).thenReturn(itemSource); LogEvent logEvent = createDefaultTestLogEvent(); // when itemAppender.append(formattedIndexName, logEvent); // then assertEquals(ItemSourceAppender.class, itemAppender.getClass()); verify(itemSourceLayout).serialize(logEventCaptor.capture()); assertEquals(logEvent, logEventCaptor.getValue()); verify(batchDelivery).add(indexNameCaptor.capture(), itemSourceCaptor.capture()); assertEquals(formattedIndexName, indexNameCaptor.getValue()); assertEquals(expectedMessage, itemSourceCaptor.getValue().getSource()); }
@Test public void appenderDelegatesToItemAppender() { // given ItemAppender itemAppender = mock(ItemAppender.class); ItemAppenderFactory itemAppenderFactory = mockedItemAppenderFactory(); when(itemAppenderFactory.createInstance(anyBoolean(), any(AbstractLayout.class), any(BatchDelivery.class))) .thenReturn(itemAppender); ElasticsearchAppender appender = createTestElasticsearchAppender(itemAppenderFactory); LogEvent logEvent = mock(LogEvent.class); // when appender.append(logEvent); // then verify(itemAppender, times(1)).append(anyString(), eq(logEvent)); }