From ab15198954811d2c7278cd43987c6ecfcca44341 Mon Sep 17 00:00:00 2001 From: bedrin Date: Fri, 21 Oct 2016 00:25:10 +0300 Subject: [PATCH 01/13] Added second disruptor; fixed some unit tests --- .../AbstractLogstashTcpSocketAppender.java | 155 ++++++++++++++---- .../appender/AsyncDisruptorAppender.java | 2 +- .../logback/marker/LogstashBasicMarker.java | 0 .../logback/marker/LogstashMarker.java | 0 .../marker/MapEntriesAppendingMarker.java | 0 .../net/logstash/logback/marker/Markers.java | 0 .../logback/marker/ObjectAppendingMarker.java | 0 .../marker/ObjectFieldsAppendingMarker.java | 0 .../marker/RawJsonAppendingMarker.java | 0 .../marker/SingleFieldAppendingMarker.java | 0 .../LogstashTcpSocketAppenderTest.java | 17 +- .../marker/MapEntriesAppendingMarkerTest.java | 0 .../marker/ObjectAppendingMarkerTest.java | 0 .../ObjectFieldsAppendingMarkerTest.java | 0 .../marker/RawJsonAppendingMarkerTest.java | 0 15 files changed, 129 insertions(+), 45 deletions(-) mode change 100755 => 100644 src/main/java/net/logstash/logback/marker/LogstashBasicMarker.java mode change 100755 => 100644 src/main/java/net/logstash/logback/marker/LogstashMarker.java mode change 100755 => 100644 src/main/java/net/logstash/logback/marker/MapEntriesAppendingMarker.java mode change 100755 => 100644 src/main/java/net/logstash/logback/marker/Markers.java mode change 100755 => 100644 src/main/java/net/logstash/logback/marker/ObjectAppendingMarker.java mode change 100755 => 100644 src/main/java/net/logstash/logback/marker/ObjectFieldsAppendingMarker.java mode change 100755 => 100644 src/main/java/net/logstash/logback/marker/RawJsonAppendingMarker.java mode change 100755 => 100644 src/main/java/net/logstash/logback/marker/SingleFieldAppendingMarker.java mode change 100755 => 100644 src/test/java/net/logstash/logback/marker/MapEntriesAppendingMarkerTest.java mode change 100755 => 100644 src/test/java/net/logstash/logback/marker/ObjectAppendingMarkerTest.java mode change 100755 => 100644 src/test/java/net/logstash/logback/marker/ObjectFieldsAppendingMarkerTest.java mode change 100755 => 100644 src/test/java/net/logstash/logback/marker/RawJsonAppendingMarkerTest.java diff --git a/src/main/java/net/logstash/logback/appender/AbstractLogstashTcpSocketAppender.java b/src/main/java/net/logstash/logback/appender/AbstractLogstashTcpSocketAppender.java index 10d3f294..d647d842 100644 --- a/src/main/java/net/logstash/logback/appender/AbstractLogstashTcpSocketAppender.java +++ b/src/main/java/net/logstash/logback/appender/AbstractLogstashTcpSocketAppender.java @@ -13,10 +13,7 @@ */ package net.logstash.logback.appender; -import java.io.BufferedOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; +import java.io.*; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.Socket; @@ -27,18 +24,16 @@ import java.util.Collections; import java.util.Formatter; import java.util.List; -import java.util.concurrent.BlockingQueue; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.Future; -import java.util.concurrent.RejectedExecutionException; -import java.util.concurrent.ScheduledFuture; -import java.util.concurrent.TimeUnit; +import java.util.concurrent.*; import javax.net.SocketFactory; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSocket; import javax.net.ssl.SSLSocketFactory; +import com.lmax.disruptor.*; +import com.lmax.disruptor.dsl.Disruptor; +import com.lmax.disruptor.dsl.ProducerType; import net.logstash.logback.encoder.SeparatorParser; import org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement; @@ -53,10 +48,6 @@ import ch.qos.logback.core.util.CloseUtil; import ch.qos.logback.core.util.Duration; -import com.lmax.disruptor.EventHandler; -import com.lmax.disruptor.LifecycleAware; -import com.lmax.disruptor.RingBuffer; - /** * An {@link AsyncDisruptorAppender} appender that writes * events to a TCP {@link Socket} outputStream. @@ -252,11 +243,119 @@ public abstract class AbstractLogstashTcpSocketAppender> networkDisruptor; + + private LogEventFactory networkEventFactory = new LogEventFactory(); + + private int ringBufferSize = DEFAULT_RING_BUFFER_SIZE; + + private ScheduledThreadPoolExecutor executorService; + + private ProducerType producerType = DEFAULT_PRODUCER_TYPE; + + private WaitStrategy waitStrategy = DEFAULT_WAIT_STRATEGY; + + private ByteArrayOutputStream baos = new ByteArrayOutputStream(); + + private final static LogEventTranslator LOG_EVENT_ENCODER_TRANSLATOR = new LogEventTranslator(); + + /** + * Event handler responsible for encoding events + */ + private class EncodingEventHandler implements EventHandler>, LifecycleAware { + + private final AbstractLogstashTcpSocketAppender.TcpSendingEventHandler tcpSendingEventHandler; + + private EncodingEventHandler(AbstractLogstashTcpSocketAppender.TcpSendingEventHandler tcpSendingEventHandler) { + this.tcpSendingEventHandler = tcpSendingEventHandler; + } + + @Override + public void onEvent(LogEvent logEvent, long sequence, boolean endOfBatch) throws Exception { + + if (logEvent.event != null) { + + encoder.doEncode(logEvent.event); + byte[] encodedEvent = baos.toByteArray(); + baos.reset(); + + networkDisruptor.getRingBuffer().publishEvent(LOG_EVENT_ENCODER_TRANSLATOR, encodedEvent); + + } + + } + + @Override + public void onStart() { + + executorService = new ScheduledThreadPoolExecutor( + getThreadPoolCoreSize()/*, + this.threadFactory*/); + + networkDisruptor = new Disruptor>( + networkEventFactory, + ringBufferSize, + executorService, + producerType, + waitStrategy); + + // networkDisruptor.handleExceptionsWith(this.exceptionHandler); // TODO: fix + + networkDisruptor.handleEventsWith(tcpSendingEventHandler); + + try { + encoder.init(baos); + } catch (IOException ioe) { + addStatus(new ErrorStatus( + "Failed to init encoder", this, ioe)); + } + + tcpSendingEventHandler.onStart(); + + networkDisruptor.start(); + } + + @Override + public void onShutdown() { + closeEncoder(); + tcpSendingEventHandler.onShutdown(); + + try { + networkDisruptor.shutdown(1, TimeUnit.MINUTES); + } catch (com.lmax.disruptor.TimeoutException e) { + addWarn("Some queued events have not been logged due to requested shutdown"); + } + + executorService.shutdown(); + + try { + if (!executorService.awaitTermination(1, TimeUnit.MINUTES)) { + addWarn("Some queued events have not been logged due to requested shutdown"); + } + } catch (InterruptedException e) { + addWarn("Some queued events have not been logged due to requested shutdown", e); + } + } + + private void closeEncoder() { + try { + encoder.close(); + } catch (IOException ioe) { + addStatus(new ErrorStatus( + "Failed to close encoder", this, ioe)); + } + + encoder.stop(); + } + + } + + /** * Event handler responsible for performing the TCP transmission. */ - private class TcpSendingEventHandler implements EventHandler>, LifecycleAware { + private class TcpSendingEventHandler implements EventHandler>, LifecycleAware { /** * Max number of consecutive failed connection attempts for which @@ -345,7 +444,7 @@ public void run() { * * A null event indicates that this is a keep alive message. */ - getDisruptor().getRingBuffer().publishEvent(getEventTranslator(), null); + networkDisruptor.getRingBuffer().publishEvent(LOG_EVENT_ENCODER_TRANSLATOR, null); scheduleKeepAlive(currentTime); } else { scheduleKeepAlive(lastSent); @@ -404,7 +503,7 @@ public void run() { } @Override - public void onEvent(LogEvent logEvent, long sequence, boolean endOfBatch) throws Exception { + public void onEvent(LogEvent encodedLogEvent, long sequence, boolean endOfBatch) throws Exception { for (int i = 0; i < MAX_REPEAT_WRITE_ATTEMPTS; i++) { if (this.socket == null) { @@ -433,12 +532,12 @@ public void onEvent(LogEvent logEvent, long sequence, boolean endOfBatch) /* * A null event indicates that this is a keep alive message. */ - if (logEvent.event != null) { + if (encodedLogEvent != null) { /* * This is a standard (non-keepAlive) event. * Therefore, we need to send the event. */ - encoder.doEncode(logEvent.event); + outputStream.write(encodedLogEvent.event); } else if (hasKeepAliveDurationElapsed(lastSentTimestamp, currentTime)){ /* * This is a keep alive event, and the keepAliveDuration has passed, @@ -492,7 +591,6 @@ public void onStart() { @Override public void onShutdown() { unscheduleKeepAlive(); - closeEncoder(); closeSocket(); } @@ -536,8 +634,6 @@ private synchronized void openSocket() { tempSocket.connect(new InetSocketAddress(getHostString(currentDestination), currentDestination.getPort()), acceptConnectionTimeout); tempOutputStream = new BufferedOutputStream(tempSocket.getOutputStream(), writeBufferSize); - encoder.init(tempOutputStream); - addInfo(peerId + "connection established."); this.socket = tempSocket; @@ -633,17 +729,6 @@ private synchronized void closeSocket() { } } - private void closeEncoder() { - try { - encoder.close(); - } catch (IOException ioe) { - addStatus(new ErrorStatus( - "Failed to close encoder", this, ioe)); - } - - encoder.stop(); - } - private synchronized void scheduleKeepAlive(long basedOnTime) { if (isKeepAliveEnabled() && !Thread.currentThread().isInterrupted()) { if (keepAliveRunnable == null) { @@ -706,7 +791,7 @@ public Socket createSocket() throws IOException { public AbstractLogstashTcpSocketAppender() { super(); - setEventHandler(new TcpSendingEventHandler()); + setEventHandler(new EncodingEventHandler(new TcpSendingEventHandler())); setThreadNameFormat(DEFAULT_THREAD_NAME_FORMAT); } diff --git a/src/main/java/net/logstash/logback/appender/AsyncDisruptorAppender.java b/src/main/java/net/logstash/logback/appender/AsyncDisruptorAppender.java index d4749988..11c08cc2 100644 --- a/src/main/java/net/logstash/logback/appender/AsyncDisruptorAppender.java +++ b/src/main/java/net/logstash/logback/appender/AsyncDisruptorAppender.java @@ -243,7 +243,7 @@ protected static class LogEvent { * Factory for creating the initial {@link LogEvent}s to populate * the {@link RingBuffer}. */ - private static class LogEventFactory implements EventFactory> { + protected static class LogEventFactory implements EventFactory> { @Override public LogEvent newInstance() { diff --git a/src/main/java/net/logstash/logback/marker/LogstashBasicMarker.java b/src/main/java/net/logstash/logback/marker/LogstashBasicMarker.java old mode 100755 new mode 100644 diff --git a/src/main/java/net/logstash/logback/marker/LogstashMarker.java b/src/main/java/net/logstash/logback/marker/LogstashMarker.java old mode 100755 new mode 100644 diff --git a/src/main/java/net/logstash/logback/marker/MapEntriesAppendingMarker.java b/src/main/java/net/logstash/logback/marker/MapEntriesAppendingMarker.java old mode 100755 new mode 100644 diff --git a/src/main/java/net/logstash/logback/marker/Markers.java b/src/main/java/net/logstash/logback/marker/Markers.java old mode 100755 new mode 100644 diff --git a/src/main/java/net/logstash/logback/marker/ObjectAppendingMarker.java b/src/main/java/net/logstash/logback/marker/ObjectAppendingMarker.java old mode 100755 new mode 100644 diff --git a/src/main/java/net/logstash/logback/marker/ObjectFieldsAppendingMarker.java b/src/main/java/net/logstash/logback/marker/ObjectFieldsAppendingMarker.java old mode 100755 new mode 100644 diff --git a/src/main/java/net/logstash/logback/marker/RawJsonAppendingMarker.java b/src/main/java/net/logstash/logback/marker/RawJsonAppendingMarker.java old mode 100755 new mode 100644 diff --git a/src/main/java/net/logstash/logback/marker/SingleFieldAppendingMarker.java b/src/main/java/net/logstash/logback/marker/SingleFieldAppendingMarker.java old mode 100755 new mode 100644 diff --git a/src/test/java/net/logstash/logback/appender/LogstashTcpSocketAppenderTest.java b/src/test/java/net/logstash/logback/appender/LogstashTcpSocketAppenderTest.java index 062a5b5d..1ffb07d1 100644 --- a/src/test/java/net/logstash/logback/appender/LogstashTcpSocketAppenderTest.java +++ b/src/test/java/net/logstash/logback/appender/LogstashTcpSocketAppenderTest.java @@ -13,9 +13,7 @@ */ package net.logstash.logback.appender; -import static org.mockito.Matchers.any; -import static org.mockito.Matchers.anyInt; -import static org.mockito.Matchers.argThat; +import static org.mockito.Matchers.*; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.inOrder; @@ -151,20 +149,21 @@ public void testReconnectOnOpen() throws Exception { @Test public void testReconnectOnWrite() throws Exception { + + doThrow(new SocketException()).doNothing().when(socket).connect(any(SocketAddress.class), anyInt()); + appender.addDestination("localhost:10000"); appender.setReconnectionDelay(new Duration(100)); appender.start(); verify(encoder).start(); - - doThrow(new SocketException()).doNothing().when(encoder).doEncode(event1); - + appender.append(event1); + + verify(socket, timeout(VERIFICATION_TIMEOUT).times(2)).connect(any(SocketAddress.class), anyInt()); - verify(encoder, timeout(VERIFICATION_TIMEOUT).times(2)).init(any(OutputStream.class)); - - verify(encoder, timeout(VERIFICATION_TIMEOUT).times(2)).doEncode(event1); + verify(encoder, timeout(VERIFICATION_TIMEOUT).times(1)).doEncode(event1); } @Test diff --git a/src/test/java/net/logstash/logback/marker/MapEntriesAppendingMarkerTest.java b/src/test/java/net/logstash/logback/marker/MapEntriesAppendingMarkerTest.java old mode 100755 new mode 100644 diff --git a/src/test/java/net/logstash/logback/marker/ObjectAppendingMarkerTest.java b/src/test/java/net/logstash/logback/marker/ObjectAppendingMarkerTest.java old mode 100755 new mode 100644 diff --git a/src/test/java/net/logstash/logback/marker/ObjectFieldsAppendingMarkerTest.java b/src/test/java/net/logstash/logback/marker/ObjectFieldsAppendingMarkerTest.java old mode 100755 new mode 100644 diff --git a/src/test/java/net/logstash/logback/marker/RawJsonAppendingMarkerTest.java b/src/test/java/net/logstash/logback/marker/RawJsonAppendingMarkerTest.java old mode 100755 new mode 100644 From 8c69024662abef4d64b7258a9f52e9db8d818fd5 Mon Sep 17 00:00:00 2001 From: bedrin Date: Fri, 21 Oct 2016 01:08:58 +0300 Subject: [PATCH 02/13] Do not start/stop tcpSendingEventHandler explicitly - it's done by Disruptor --- .../logback/appender/AbstractLogstashTcpSocketAppender.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/logstash/logback/appender/AbstractLogstashTcpSocketAppender.java b/src/main/java/net/logstash/logback/appender/AbstractLogstashTcpSocketAppender.java index d647d842..c422ea44 100644 --- a/src/main/java/net/logstash/logback/appender/AbstractLogstashTcpSocketAppender.java +++ b/src/main/java/net/logstash/logback/appender/AbstractLogstashTcpSocketAppender.java @@ -311,7 +311,7 @@ public void onStart() { "Failed to init encoder", this, ioe)); } - tcpSendingEventHandler.onStart(); + //tcpSendingEventHandler.onStart(); networkDisruptor.start(); } @@ -319,7 +319,7 @@ public void onStart() { @Override public void onShutdown() { closeEncoder(); - tcpSendingEventHandler.onShutdown(); + //tcpSendingEventHandler.onShutdown(); try { networkDisruptor.shutdown(1, TimeUnit.MINUTES); From c01ed88d89e18a60dde23033354c46cefb5938cb Mon Sep 17 00:00:00 2001 From: bedrin Date: Fri, 21 Oct 2016 01:33:06 +0300 Subject: [PATCH 03/13] Fixed keepalive --- .../logback/appender/AbstractLogstashTcpSocketAppender.java | 4 ++-- .../logback/appender/LogstashTcpSocketAppenderTest.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/net/logstash/logback/appender/AbstractLogstashTcpSocketAppender.java b/src/main/java/net/logstash/logback/appender/AbstractLogstashTcpSocketAppender.java index c422ea44..4b7e9938 100644 --- a/src/main/java/net/logstash/logback/appender/AbstractLogstashTcpSocketAppender.java +++ b/src/main/java/net/logstash/logback/appender/AbstractLogstashTcpSocketAppender.java @@ -532,7 +532,7 @@ public void onEvent(LogEvent encodedLogEvent, long sequence, boolean end /* * A null event indicates that this is a keep alive message. */ - if (encodedLogEvent != null) { + if (encodedLogEvent.event != null) { /* * This is a standard (non-keepAlive) event. * Therefore, we need to send the event. @@ -736,7 +736,7 @@ private synchronized void scheduleKeepAlive(long basedOnTime) { } long delay = keepAliveDuration.getMilliseconds() - (System.currentTimeMillis() - basedOnTime); try { - keepAliveFuture = getExecutorService().schedule( + keepAliveFuture = executorService.schedule( keepAliveRunnable, delay, TimeUnit.MILLISECONDS); diff --git a/src/test/java/net/logstash/logback/appender/LogstashTcpSocketAppenderTest.java b/src/test/java/net/logstash/logback/appender/LogstashTcpSocketAppenderTest.java index 1ffb07d1..f43d9a85 100644 --- a/src/test/java/net/logstash/logback/appender/LogstashTcpSocketAppenderTest.java +++ b/src/test/java/net/logstash/logback/appender/LogstashTcpSocketAppenderTest.java @@ -187,8 +187,8 @@ public void testReconnectOnReadFailure() throws Exception { verify(encoder).start(); appender.append(event1); - - verify(encoder, timeout(VERIFICATION_TIMEOUT).times(2)).init(any(OutputStream.class)); + + verify(socket, timeout(VERIFICATION_TIMEOUT).times(2)).connect(any(SocketAddress.class), anyInt()); verify(encoder, timeout(VERIFICATION_TIMEOUT)).doEncode(event1); } From 56ebc80b3ff8ee7069a9167a2b1209b3205041fc Mon Sep 17 00:00:00 2001 From: bedrin Date: Sat, 22 Oct 2016 23:28:48 +0300 Subject: [PATCH 04/13] Fixed rest of unit tests --- .../LogstashTcpSocketAppenderTest.java | 81 +++++++++---------- 1 file changed, 36 insertions(+), 45 deletions(-) diff --git a/src/test/java/net/logstash/logback/appender/LogstashTcpSocketAppenderTest.java b/src/test/java/net/logstash/logback/appender/LogstashTcpSocketAppenderTest.java index f43d9a85..d45076e8 100644 --- a/src/test/java/net/logstash/logback/appender/LogstashTcpSocketAppenderTest.java +++ b/src/test/java/net/logstash/logback/appender/LogstashTcpSocketAppenderTest.java @@ -13,30 +13,12 @@ */ package net.logstash.logback.appender; -import static org.mockito.Matchers.*; -import static org.mockito.Mockito.doNothing; -import static org.mockito.Mockito.doThrow; -import static org.mockito.Mockito.inOrder; -import static org.mockito.Mockito.reset; -import static org.mockito.Mockito.timeout; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.OutputStream; -import java.net.InetSocketAddress; -import java.net.Socket; -import java.net.SocketAddress; -import java.net.SocketException; -import java.net.SocketTimeoutException; -import java.nio.charset.Charset; -import java.util.concurrent.Future; - -import javax.net.SocketFactory; - +import ch.qos.logback.classic.spi.ILoggingEvent; +import ch.qos.logback.core.Context; +import ch.qos.logback.core.encoder.Encoder; +import ch.qos.logback.core.status.StatusManager; +import ch.qos.logback.core.util.Duration; import net.logstash.logback.encoder.SeparatorParser; - import org.junit.After; import org.junit.Assert; import org.junit.Before; @@ -48,11 +30,18 @@ import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; -import ch.qos.logback.classic.spi.ILoggingEvent; -import ch.qos.logback.core.Context; -import ch.qos.logback.core.encoder.Encoder; -import ch.qos.logback.core.status.StatusManager; -import ch.qos.logback.core.util.Duration; +import javax.net.SocketFactory; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.net.*; +import java.nio.charset.Charset; +import java.util.concurrent.Future; + +import static org.mockito.Matchers.any; +import static org.mockito.Matchers.anyInt; +import static org.mockito.Matchers.argThat; +import static org.mockito.Mockito.*; @RunWith(MockitoJUnitRunner.class) public class LogstashTcpSocketAppenderTest { @@ -72,7 +61,7 @@ public class LogstashTcpSocketAppenderTest { private ILoggingEvent event1; @Mock - private ILoggingEvent event2; + private ByteArrayOutputStream byteArrayOutputStream; @Mock private SocketFactory socketFactory; @@ -130,21 +119,23 @@ public void testEncoderCalled() throws Exception { public void testReconnectOnOpen() throws Exception { appender.addDestination("localhost:10000"); appender.setReconnectionDelay(new Duration(100)); - - reset(socketFactory); - when(socketFactory.createSocket()) - .thenThrow(new SocketTimeoutException()) - .thenReturn(socket); - + + doThrow(SocketTimeoutException.class) + .doNothing() + .when(socket).connect(host("localhost", 10000), anyInt()); + + doReturn(new byte[]{0}).when(byteArrayOutputStream).toByteArray(); + appender.start(); verify(encoder).start(); appender.append(event1); - - verify(encoder, timeout(VERIFICATION_TIMEOUT)).init(any(OutputStream.class)); - - verify(encoder, timeout(VERIFICATION_TIMEOUT)).doEncode(event1); + + verify(socket, timeout(VERIFICATION_TIMEOUT)).connect(any(SocketAddress.class), anyInt()); + + verify(outputStream, timeout(VERIFICATION_TIMEOUT)).write(any(byte[].class), anyInt(), anyInt()); + } @Test @@ -273,9 +264,11 @@ public void testReconnectToSecondaryOnWrite() throws Exception { // First attempt of sending the event throws an exception while subsequent // attempts will succeed. This should force the appender to close the connection // and attempt to reconnect starting from the first host of the list. - doThrow(new SocketException()) + doReturn(new byte[]{0}).when(byteArrayOutputStream).toByteArray(); + + doThrow(new IOException()) .doNothing() - .when(encoder).doEncode(event1); + .when(outputStream).write(any(byte[].class), anyInt(), anyInt()); // Start the appender and verify it is actually started @@ -285,7 +278,6 @@ public void testReconnectToSecondaryOnWrite() throws Exception { appender.append(event1); - // THREE connection attempts must have been made in total verify(socket, timeout(VERIFICATION_TIMEOUT).times(3)).connect(any(SocketAddress.class), anyInt()); InOrder inOrder = inOrder(socket); @@ -371,10 +363,9 @@ public void testReconnectWaitWhenExhausted() throws Exception { // At this point, it should be connected to primary. appender.start(); verify(encoder).start(); - - + // THREE connection attempts must have been made in total - verify(socket, timeout(appender.getReconnectionDelay().getMilliseconds()+50).times(3)).connect(any(SocketAddress.class), anyInt()); + verify(socket, timeout(VERIFICATION_TIMEOUT).times(3)).connect(any(SocketAddress.class), anyInt()); InOrder inOrder = inOrder(socket, encoder); // 1) fail to connect on primary at startup From 7997817bbee88fbf33991fc990cdb54a61559c98 Mon Sep 17 00:00:00 2001 From: bedrin Date: Sun, 23 Oct 2016 13:16:05 +0300 Subject: [PATCH 05/13] Use ProducerType.SINGLE in network disruptor; use exceptions handler --- .../AbstractLogstashTcpSocketAppender.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/java/net/logstash/logback/appender/AbstractLogstashTcpSocketAppender.java b/src/main/java/net/logstash/logback/appender/AbstractLogstashTcpSocketAppender.java index 4b7e9938..775566eb 100644 --- a/src/main/java/net/logstash/logback/appender/AbstractLogstashTcpSocketAppender.java +++ b/src/main/java/net/logstash/logback/appender/AbstractLogstashTcpSocketAppender.java @@ -252,7 +252,9 @@ public abstract class AbstractLogstashTcpSocketAppender exceptionHandler = new LogEventExceptionHandler(); + + private ThreadFactory threadFactory = new WorkerThreadFactory(); private WaitStrategy waitStrategy = DEFAULT_WAIT_STRATEGY; @@ -286,23 +288,24 @@ public void onEvent(LogEvent logEvent, long sequence, boolean endOfBatch) } + @SuppressWarnings("unchecked") @Override public void onStart() { executorService = new ScheduledThreadPoolExecutor( - getThreadPoolCoreSize()/*, - this.threadFactory*/); + getThreadPoolCoreSize(), + threadFactory); networkDisruptor = new Disruptor>( networkEventFactory, ringBufferSize, executorService, - producerType, + ProducerType.SINGLE, waitStrategy); - // networkDisruptor.handleExceptionsWith(this.exceptionHandler); // TODO: fix + networkDisruptor.handleExceptionsWith(exceptionHandler); // TODO: fix - networkDisruptor.handleEventsWith(tcpSendingEventHandler); + networkDisruptor.handleEventsWith(new EventClearingEventHandler(tcpSendingEventHandler)); try { encoder.init(baos); @@ -311,15 +314,12 @@ public void onStart() { "Failed to init encoder", this, ioe)); } - //tcpSendingEventHandler.onStart(); - networkDisruptor.start(); } @Override public void onShutdown() { closeEncoder(); - //tcpSendingEventHandler.onShutdown(); try { networkDisruptor.shutdown(1, TimeUnit.MINUTES); From c76817e4a88f6f2702ea1bd056144e1ef40e2841 Mon Sep 17 00:00:00 2001 From: bedrin Date: Sun, 23 Oct 2016 13:42:47 +0300 Subject: [PATCH 06/13] Use ProducerType.SINGLE in network disruptor; use exceptions handler --- .../logback/appender/AsyncDisruptorAppender.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/net/logstash/logback/appender/AsyncDisruptorAppender.java b/src/main/java/net/logstash/logback/appender/AsyncDisruptorAppender.java index 11c08cc2..f4bd5dfb 100644 --- a/src/main/java/net/logstash/logback/appender/AsyncDisruptorAppender.java +++ b/src/main/java/net/logstash/logback/appender/AsyncDisruptorAppender.java @@ -212,7 +212,7 @@ public abstract class AsyncDisruptorAppender> exceptionHandler = new LogEventExceptionHandler(); + private ExceptionHandler exceptionHandler = new LogEventExceptionHandler(); /** * Consecutive number of dropped events. @@ -254,7 +254,7 @@ public LogEvent newInstance() { /** * The default {@link ThreadFactory} used to create the handler thread. */ - private class WorkerThreadFactory implements ThreadFactory { + protected class WorkerThreadFactory implements ThreadFactory { @Override public Thread newThread(Runnable r) { @@ -283,10 +283,10 @@ public void translateTo(LogEvent logEvent, long sequence, Event event) { * * Currently, just logs to the logback context. */ - private class LogEventExceptionHandler implements ExceptionHandler> { + protected class LogEventExceptionHandler implements ExceptionHandler { @Override - public void handleEventException(Throwable ex, long sequence, LogEvent event) { + public void handleEventException(Throwable ex, long sequence, LogEvent event) { addError("Unable to process event: " + ex.getMessage(), ex); } @@ -305,7 +305,7 @@ public void handleOnShutdownException(Throwable ex) { * Clears the event after a delegate event handler has processed the event, * so that the event can be garbage collected. */ - private static class EventClearingEventHandler implements EventHandler>, LifecycleAware { + protected static class EventClearingEventHandler implements EventHandler>, LifecycleAware { private final EventHandler> delegate; From 91142ae27b704d9d1e32ed3d1d836702a9777584 Mon Sep 17 00:00:00 2001 From: bedrin Date: Sun, 23 Oct 2016 15:10:46 +0300 Subject: [PATCH 07/13] networkDisruptor made configurable --- .../AbstractLogstashTcpSocketAppender.java | 56 +++++++++++++++++-- 1 file changed, 51 insertions(+), 5 deletions(-) diff --git a/src/main/java/net/logstash/logback/appender/AbstractLogstashTcpSocketAppender.java b/src/main/java/net/logstash/logback/appender/AbstractLogstashTcpSocketAppender.java index 775566eb..afbdb8f6 100644 --- a/src/main/java/net/logstash/logback/appender/AbstractLogstashTcpSocketAppender.java +++ b/src/main/java/net/logstash/logback/appender/AbstractLogstashTcpSocketAppender.java @@ -244,20 +244,51 @@ public abstract class AbstractLogstashTcpSocketAppender> networkDisruptor; + /** + * The {@link EventFactory} used to create encoded {@link LogEvent}s for the RingBuffer. + */ private LogEventFactory networkEventFactory = new LogEventFactory(); - private int ringBufferSize = DEFAULT_RING_BUFFER_SIZE; + /** + * The size of the {@link RingBuffer} with encoded messages. + * Defaults to {@value #DEFAULT_RING_BUFFER_SIZE}. + * If the handler thread is not as fast as the producing threads, + * then the {@link RingBuffer} will eventually fill up, + * at which point producer will block. + *

+ * Must be a positive power of 2. + */ + private int networkRingBufferSize = DEFAULT_RING_BUFFER_SIZE; + /** + * The {@link ScheduledExecutorService} used to execute the handler task. + */ private ScheduledThreadPoolExecutor executorService; private ExceptionHandler exceptionHandler = new LogEventExceptionHandler(); - private ThreadFactory threadFactory = new WorkerThreadFactory(); + private ThreadFactory threadFactory = new WorkerThreadFactory(); // TODO: things to do here - private WaitStrategy waitStrategy = DEFAULT_WAIT_STRATEGY; + /** + * The {@link WaitStrategy} to used by the RingBuffer + * when pulling encoded events to be processed by {@link #eventHandler}. + *

+ * By default, a {@link BlockingWaitStrategy} is used, which is the most + * CPU conservative, but results in a higher latency. + * If you need lower latency (at the cost of higher CPU usage), + * consider using a {@link SleepingWaitStrategy} or a {@link PhasedBackoffWaitStrategy}. + */ + private WaitStrategy networkWaitStrategy = DEFAULT_WAIT_STRATEGY; + /** + * Temporary byte array used for encoding events + */ private ByteArrayOutputStream baos = new ByteArrayOutputStream(); private final static LogEventTranslator LOG_EVENT_ENCODER_TRANSLATOR = new LogEventTranslator(); @@ -298,10 +329,10 @@ public void onStart() { networkDisruptor = new Disruptor>( networkEventFactory, - ringBufferSize, + networkRingBufferSize, executorService, ProducerType.SINGLE, - waitStrategy); + networkWaitStrategy); networkDisruptor.handleExceptionsWith(exceptionHandler); // TODO: fix @@ -1217,4 +1248,19 @@ public void setThreadNameFormat(String threadNameFormat) { super.setThreadNameFormat(threadNameFormat); } + public int getNetworkRingBufferSize() { + return networkRingBufferSize; + } + + public void setNetworkRingBufferSize(int networkRingBufferSize) { + this.networkRingBufferSize = networkRingBufferSize; + } + + public WaitStrategy getNetworkWaitStrategy() { + return networkWaitStrategy; + } + + public void setNetworkWaitStrategy(WaitStrategy networkWaitStrategy) { + this.networkWaitStrategy = networkWaitStrategy; + } } From ec03a2837de5bae317e670d40f6b17f5acb39294 Mon Sep 17 00:00:00 2001 From: bedrin Date: Sun, 23 Oct 2016 20:36:16 +0300 Subject: [PATCH 08/13] networkDisruptor made configurable --- .../AbstractLogstashTcpSocketAppender.java | 38 +++++++++++++++++-- .../appender/AsyncDisruptorAppender.java | 12 +++--- 2 files changed, 42 insertions(+), 8 deletions(-) diff --git a/src/main/java/net/logstash/logback/appender/AbstractLogstashTcpSocketAppender.java b/src/main/java/net/logstash/logback/appender/AbstractLogstashTcpSocketAppender.java index afbdb8f6..d0a81d6a 100644 --- a/src/main/java/net/logstash/logback/appender/AbstractLogstashTcpSocketAppender.java +++ b/src/main/java/net/logstash/logback/appender/AbstractLogstashTcpSocketAppender.java @@ -73,7 +73,8 @@ public abstract class AbstractLogstashTcpSocketAppender exceptionHandler = new LogEventExceptionHandler(); - private ThreadFactory threadFactory = new WorkerThreadFactory(); // TODO: things to do here + private ThreadFactory networkThreadFactory = new NetworkWorkerThreadFactory(); + + /** + * The default {@link ThreadFactory} used to create the handler thread. + */ + private class NetworkWorkerThreadFactory implements ThreadFactory { + + @Override + public Thread newThread(Runnable r) { + Thread t = new Thread(r); + t.setName(calculateThreadName()); + t.setDaemon(useDaemonThread); + return t; + } + + } + + protected String calculateThreadName() { + List threadNameFormatParams = getThreadNameFormatParams(); + return String.format(networkThreadNameFormat, threadNameFormatParams.toArray(new Object[threadNameFormatParams.size()])); + } + + private String networkThreadNameFormat = DEFAULT_NETWORK_THREAD_NAME_FORMAT; /** * The {@link WaitStrategy} to used by the RingBuffer @@ -325,7 +348,7 @@ public void onStart() { executorService = new ScheduledThreadPoolExecutor( getThreadPoolCoreSize(), - threadFactory); + networkThreadFactory); networkDisruptor = new Disruptor>( networkEventFactory, @@ -1263,4 +1286,13 @@ public WaitStrategy getNetworkWaitStrategy() { public void setNetworkWaitStrategy(WaitStrategy networkWaitStrategy) { this.networkWaitStrategy = networkWaitStrategy; } + + public String getNetworkThreadNameFormat() { + return networkThreadNameFormat; + } + + public void setNetworkThreadNameFormat(String networkThreadNameFormat) { + this.networkThreadNameFormat = networkThreadNameFormat; + } + } diff --git a/src/main/java/net/logstash/logback/appender/AsyncDisruptorAppender.java b/src/main/java/net/logstash/logback/appender/AsyncDisruptorAppender.java index f4bd5dfb..c03fc2ef 100644 --- a/src/main/java/net/logstash/logback/appender/AsyncDisruptorAppender.java +++ b/src/main/java/net/logstash/logback/appender/AsyncDisruptorAppender.java @@ -168,7 +168,7 @@ public abstract class AsyncDisruptorAppender newInstance() { /** * The default {@link ThreadFactory} used to create the handler thread. */ - protected class WorkerThreadFactory implements ThreadFactory { - + private class WorkerThreadFactory implements ThreadFactory { + @Override public Thread newThread(Runnable r) { Thread t = new Thread(r); @@ -263,11 +263,12 @@ public Thread newThread(Runnable r) { t.setDaemon(useDaemonThread); return t; } + } - + /** * Sets the {@link LogEvent#event} to the logback Event. - * Used when publishing events to the {@link RingBuffer}. + * Used when publishing events to the {@link RingBuffer}. */ protected static class LogEventTranslator implements EventTranslatorOneArg, Event> { @@ -470,6 +471,7 @@ protected List getThreadNameFormatParams() { getName(), threadNumber.incrementAndGet()); } + protected void setEventFactory(LogEventFactory eventFactory) { this.eventFactory = eventFactory; } From 03b542247ea22d45671a1bdc1bee964705e9b3be Mon Sep 17 00:00:00 2001 From: bedrin Date: Sun, 23 Oct 2016 20:42:53 +0300 Subject: [PATCH 09/13] Minified changes to simplify pull request review --- .../net/logstash/logback/appender/AsyncDisruptorAppender.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/net/logstash/logback/appender/AsyncDisruptorAppender.java b/src/main/java/net/logstash/logback/appender/AsyncDisruptorAppender.java index c03fc2ef..e4f824dd 100644 --- a/src/main/java/net/logstash/logback/appender/AsyncDisruptorAppender.java +++ b/src/main/java/net/logstash/logback/appender/AsyncDisruptorAppender.java @@ -263,7 +263,6 @@ public Thread newThread(Runnable r) { t.setDaemon(useDaemonThread); return t; } - } /** @@ -471,7 +470,6 @@ protected List getThreadNameFormatParams() { getName(), threadNumber.incrementAndGet()); } - protected void setEventFactory(LogEventFactory eventFactory) { this.eventFactory = eventFactory; } From d9523d62db363f84a7acca34f164389600c39954 Mon Sep 17 00:00:00 2001 From: bedrin Date: Sun, 23 Oct 2016 23:43:35 +0300 Subject: [PATCH 10/13] Reordered fields and method in AbstractLogstashTcpSocketAppender --- .../AbstractLogstashTcpSocketAppender.java | 64 +++++++++++++------ 1 file changed, 44 insertions(+), 20 deletions(-) diff --git a/src/main/java/net/logstash/logback/appender/AbstractLogstashTcpSocketAppender.java b/src/main/java/net/logstash/logback/appender/AbstractLogstashTcpSocketAppender.java index d0a81d6a..8335f956 100644 --- a/src/main/java/net/logstash/logback/appender/AbstractLogstashTcpSocketAppender.java +++ b/src/main/java/net/logstash/logback/appender/AbstractLogstashTcpSocketAppender.java @@ -272,30 +272,34 @@ public abstract class AbstractLogstashTcpSocketAppender exceptionHandler = new LogEventExceptionHandler(); + /** + * Defines what happens when there is an exception during + * {@link RingBuffer} processing of encoded events. + */ + private ExceptionHandler networkExceptionHandler = new LogEventExceptionHandler(); + /** + * The {@link ThreadFactory} used to create the handler thread for encoded events. + */ private ThreadFactory networkThreadFactory = new NetworkWorkerThreadFactory(); /** - * The default {@link ThreadFactory} used to create the handler thread. + * Pattern used by the {@link WorkerThreadFactory} to set the + * handler thread name. + * Defaults to {@value #DEFAULT_NETWORK_THREAD_NAME_FORMAT}. + *

+ * + * If you change the {@link #networkThreadFactory}, then this + * value may not be honored. + *

+ * + * The string is a format pattern understood by {@link Formatter#format(String, Object...)}. + * {@link Formatter#format(String, Object...)} is used to + * construct the actual thread name prefix. + * The first argument (%1$s) is the string appender name. + * The second argument (%2$d) is the numerical thread index. + * Other arguments can be made available by subclasses. */ - private class NetworkWorkerThreadFactory implements ThreadFactory { - - @Override - public Thread newThread(Runnable r) { - Thread t = new Thread(r); - t.setName(calculateThreadName()); - t.setDaemon(useDaemonThread); - return t; - } - - } - - protected String calculateThreadName() { - List threadNameFormatParams = getThreadNameFormatParams(); - return String.format(networkThreadNameFormat, threadNameFormatParams.toArray(new Object[threadNameFormatParams.size()])); - } - private String networkThreadNameFormat = DEFAULT_NETWORK_THREAD_NAME_FORMAT; /** @@ -316,6 +320,21 @@ protected String calculateThreadName() { private final static LogEventTranslator LOG_EVENT_ENCODER_TRANSLATOR = new LogEventTranslator(); + /** + * The default {@link ThreadFactory} used to create the handler thread. + */ + private class NetworkWorkerThreadFactory implements ThreadFactory { + + @Override + public Thread newThread(Runnable r) { + Thread t = new Thread(r); + t.setName(calculateThreadName()); + t.setDaemon(useDaemonThread); + return t; + } + + } + /** * Event handler responsible for encoding events */ @@ -357,7 +376,7 @@ public void onStart() { ProducerType.SINGLE, networkWaitStrategy); - networkDisruptor.handleExceptionsWith(exceptionHandler); // TODO: fix + networkDisruptor.handleExceptionsWith(networkExceptionHandler); networkDisruptor.handleEventsWith(new EventClearingEventHandler(tcpSendingEventHandler)); @@ -1271,6 +1290,11 @@ public void setThreadNameFormat(String threadNameFormat) { super.setThreadNameFormat(threadNameFormat); } + protected String calculateThreadName() { + List threadNameFormatParams = getThreadNameFormatParams(); + return String.format(networkThreadNameFormat, threadNameFormatParams.toArray(new Object[threadNameFormatParams.size()])); + } + public int getNetworkRingBufferSize() { return networkRingBufferSize; } From 3d6779501993806650eda0d03b6b15c38a04bd29 Mon Sep 17 00:00:00 2001 From: bedrin Date: Sun, 23 Oct 2016 23:56:34 +0300 Subject: [PATCH 11/13] Updated documentation --- README.md | 5 +++-- .../appender/AbstractLogstashTcpSocketAppender.java | 12 ++++++------ 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 6b0765f7..89219f2a 100644 --- a/README.md +++ b/README.md @@ -205,12 +205,13 @@ You can use a `Logstash*Encoder`, `*EventCompositeJsonEncoder`, or any other log All of the output formatting options are configured at the encoder level. Internally, the TCP appenders are asynchronous (using the [LMAX Disruptor RingBuffer](https://lmax-exchange.github.io/disruptor/)). -All the encoding and TCP communication is delegated to a single writer thread. +All the encoding and TCP communication are delegated to two threads accordingly. There is no need to wrap the TCP appenders with another asynchronous appender (such as `AsyncAppender` or `LoggingEventAsyncDisruptorAppender`). All the configuration parameters (except for sub-appender) of the [async appenders](#async) -are valid for TCP appenders. For example, `waitStrategyType` and `ringBufferSize`. +are valid for TCP appenders. For example, `waitStrategyType` and `ringBufferSize`. +They are used for customizing the encoding thread. Communication thread has its own properties with a `network` prefix such as `networkRingBufferSize`, `networkWaitStrategy`, `networkThreadNameFormat` - see [AbstractLogstashTcpSocketAppender](https://github.com/bedrin/logstash-logback-encoder/blob/master/src/main/java/net/logstash/logback/appender/AbstractLogstashTcpSocketAppender.java) for details. The TCP appenders will never block the logging thread. If the RingBuffer is full (e.g. due to slow network, etc), then events will be dropped. diff --git a/src/main/java/net/logstash/logback/appender/AbstractLogstashTcpSocketAppender.java b/src/main/java/net/logstash/logback/appender/AbstractLogstashTcpSocketAppender.java index 8335f956..3029b6bb 100644 --- a/src/main/java/net/logstash/logback/appender/AbstractLogstashTcpSocketAppender.java +++ b/src/main/java/net/logstash/logback/appender/AbstractLogstashTcpSocketAppender.java @@ -270,7 +270,7 @@ public abstract class AbstractLogstashTcpSocketAppender logEvent, long sequence, boolean endOfBatch) @Override public void onStart() { - executorService = new ScheduledThreadPoolExecutor( + networkExecutorService = new ScheduledThreadPoolExecutor( getThreadPoolCoreSize(), networkThreadFactory); networkDisruptor = new Disruptor>( networkEventFactory, networkRingBufferSize, - executorService, + networkExecutorService, ProducerType.SINGLE, networkWaitStrategy); @@ -400,10 +400,10 @@ public void onShutdown() { addWarn("Some queued events have not been logged due to requested shutdown"); } - executorService.shutdown(); + networkExecutorService.shutdown(); try { - if (!executorService.awaitTermination(1, TimeUnit.MINUTES)) { + if (!networkExecutorService.awaitTermination(1, TimeUnit.MINUTES)) { addWarn("Some queued events have not been logged due to requested shutdown"); } } catch (InterruptedException e) { @@ -809,7 +809,7 @@ private synchronized void scheduleKeepAlive(long basedOnTime) { } long delay = keepAliveDuration.getMilliseconds() - (System.currentTimeMillis() - basedOnTime); try { - keepAliveFuture = executorService.schedule( + keepAliveFuture = networkExecutorService.schedule( keepAliveRunnable, delay, TimeUnit.MILLISECONDS); From 33e0c301d79dfb78ae2927bc618d85bd97c826b9 Mon Sep 17 00:00:00 2001 From: bedrin Date: Mon, 24 Oct 2016 00:14:33 +0300 Subject: [PATCH 12/13] Fixed file permissions --- README.md | 0 .../logback/appender/AbstractLogstashTcpSocketAppender.java | 0 .../net/logstash/logback/appender/AsyncDisruptorAppender.java | 0 .../java/net/logstash/logback/marker/LogstashBasicMarker.java | 0 src/main/java/net/logstash/logback/marker/LogstashMarker.java | 0 .../net/logstash/logback/marker/MapEntriesAppendingMarker.java | 0 src/main/java/net/logstash/logback/marker/Markers.java | 0 .../java/net/logstash/logback/marker/ObjectAppendingMarker.java | 0 .../net/logstash/logback/marker/ObjectFieldsAppendingMarker.java | 0 .../java/net/logstash/logback/marker/RawJsonAppendingMarker.java | 0 .../net/logstash/logback/marker/SingleFieldAppendingMarker.java | 0 .../logstash/logback/appender/LogstashTcpSocketAppenderTest.java | 0 .../logstash/logback/marker/MapEntriesAppendingMarkerTest.java | 0 .../net/logstash/logback/marker/ObjectAppendingMarkerTest.java | 0 .../logstash/logback/marker/ObjectFieldsAppendingMarkerTest.java | 0 .../net/logstash/logback/marker/RawJsonAppendingMarkerTest.java | 0 16 files changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 README.md mode change 100644 => 100755 src/main/java/net/logstash/logback/appender/AbstractLogstashTcpSocketAppender.java mode change 100644 => 100755 src/main/java/net/logstash/logback/appender/AsyncDisruptorAppender.java mode change 100644 => 100755 src/main/java/net/logstash/logback/marker/LogstashBasicMarker.java mode change 100644 => 100755 src/main/java/net/logstash/logback/marker/LogstashMarker.java mode change 100644 => 100755 src/main/java/net/logstash/logback/marker/MapEntriesAppendingMarker.java mode change 100644 => 100755 src/main/java/net/logstash/logback/marker/Markers.java mode change 100644 => 100755 src/main/java/net/logstash/logback/marker/ObjectAppendingMarker.java mode change 100644 => 100755 src/main/java/net/logstash/logback/marker/ObjectFieldsAppendingMarker.java mode change 100644 => 100755 src/main/java/net/logstash/logback/marker/RawJsonAppendingMarker.java mode change 100644 => 100755 src/main/java/net/logstash/logback/marker/SingleFieldAppendingMarker.java mode change 100644 => 100755 src/test/java/net/logstash/logback/appender/LogstashTcpSocketAppenderTest.java mode change 100644 => 100755 src/test/java/net/logstash/logback/marker/MapEntriesAppendingMarkerTest.java mode change 100644 => 100755 src/test/java/net/logstash/logback/marker/ObjectAppendingMarkerTest.java mode change 100644 => 100755 src/test/java/net/logstash/logback/marker/ObjectFieldsAppendingMarkerTest.java mode change 100644 => 100755 src/test/java/net/logstash/logback/marker/RawJsonAppendingMarkerTest.java diff --git a/README.md b/README.md old mode 100644 new mode 100755 diff --git a/src/main/java/net/logstash/logback/appender/AbstractLogstashTcpSocketAppender.java b/src/main/java/net/logstash/logback/appender/AbstractLogstashTcpSocketAppender.java old mode 100644 new mode 100755 diff --git a/src/main/java/net/logstash/logback/appender/AsyncDisruptorAppender.java b/src/main/java/net/logstash/logback/appender/AsyncDisruptorAppender.java old mode 100644 new mode 100755 diff --git a/src/main/java/net/logstash/logback/marker/LogstashBasicMarker.java b/src/main/java/net/logstash/logback/marker/LogstashBasicMarker.java old mode 100644 new mode 100755 diff --git a/src/main/java/net/logstash/logback/marker/LogstashMarker.java b/src/main/java/net/logstash/logback/marker/LogstashMarker.java old mode 100644 new mode 100755 diff --git a/src/main/java/net/logstash/logback/marker/MapEntriesAppendingMarker.java b/src/main/java/net/logstash/logback/marker/MapEntriesAppendingMarker.java old mode 100644 new mode 100755 diff --git a/src/main/java/net/logstash/logback/marker/Markers.java b/src/main/java/net/logstash/logback/marker/Markers.java old mode 100644 new mode 100755 diff --git a/src/main/java/net/logstash/logback/marker/ObjectAppendingMarker.java b/src/main/java/net/logstash/logback/marker/ObjectAppendingMarker.java old mode 100644 new mode 100755 diff --git a/src/main/java/net/logstash/logback/marker/ObjectFieldsAppendingMarker.java b/src/main/java/net/logstash/logback/marker/ObjectFieldsAppendingMarker.java old mode 100644 new mode 100755 diff --git a/src/main/java/net/logstash/logback/marker/RawJsonAppendingMarker.java b/src/main/java/net/logstash/logback/marker/RawJsonAppendingMarker.java old mode 100644 new mode 100755 diff --git a/src/main/java/net/logstash/logback/marker/SingleFieldAppendingMarker.java b/src/main/java/net/logstash/logback/marker/SingleFieldAppendingMarker.java old mode 100644 new mode 100755 diff --git a/src/test/java/net/logstash/logback/appender/LogstashTcpSocketAppenderTest.java b/src/test/java/net/logstash/logback/appender/LogstashTcpSocketAppenderTest.java old mode 100644 new mode 100755 diff --git a/src/test/java/net/logstash/logback/marker/MapEntriesAppendingMarkerTest.java b/src/test/java/net/logstash/logback/marker/MapEntriesAppendingMarkerTest.java old mode 100644 new mode 100755 diff --git a/src/test/java/net/logstash/logback/marker/ObjectAppendingMarkerTest.java b/src/test/java/net/logstash/logback/marker/ObjectAppendingMarkerTest.java old mode 100644 new mode 100755 diff --git a/src/test/java/net/logstash/logback/marker/ObjectFieldsAppendingMarkerTest.java b/src/test/java/net/logstash/logback/marker/ObjectFieldsAppendingMarkerTest.java old mode 100644 new mode 100755 diff --git a/src/test/java/net/logstash/logback/marker/RawJsonAppendingMarkerTest.java b/src/test/java/net/logstash/logback/marker/RawJsonAppendingMarkerTest.java old mode 100644 new mode 100755 From e02ab97195762c6a5652b19153657309062c4d12 Mon Sep 17 00:00:00 2001 From: bedrin Date: Mon, 24 Oct 2016 00:19:37 +0300 Subject: [PATCH 13/13] Fixed file permissions --- README.md | 0 .../logback/appender/AbstractLogstashTcpSocketAppender.java | 0 .../net/logstash/logback/appender/AsyncDisruptorAppender.java | 0 .../logstash/logback/appender/LogstashTcpSocketAppenderTest.java | 0 4 files changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 README.md mode change 100755 => 100644 src/main/java/net/logstash/logback/appender/AbstractLogstashTcpSocketAppender.java mode change 100755 => 100644 src/main/java/net/logstash/logback/appender/AsyncDisruptorAppender.java mode change 100755 => 100644 src/test/java/net/logstash/logback/appender/LogstashTcpSocketAppenderTest.java diff --git a/README.md b/README.md old mode 100755 new mode 100644 diff --git a/src/main/java/net/logstash/logback/appender/AbstractLogstashTcpSocketAppender.java b/src/main/java/net/logstash/logback/appender/AbstractLogstashTcpSocketAppender.java old mode 100755 new mode 100644 diff --git a/src/main/java/net/logstash/logback/appender/AsyncDisruptorAppender.java b/src/main/java/net/logstash/logback/appender/AsyncDisruptorAppender.java old mode 100755 new mode 100644 diff --git a/src/test/java/net/logstash/logback/appender/LogstashTcpSocketAppenderTest.java b/src/test/java/net/logstash/logback/appender/LogstashTcpSocketAppenderTest.java old mode 100755 new mode 100644