[logback-dev] [GIT] Logback: the generic, reliable, fast and flexible logging framework. branch, lbcore148, updated. v0.9.20-3-g7c54529

added by portage for gitosis-gentoo git-noreply at pixie.qos.ch
Sat Apr 3 18:29:34 CEST 2010


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Logback: the generic, reliable, fast and flexible logging framework.".

The branch, lbcore148 has been updated
       via  7c545298b251c2e1574029b945849816a8986332 (commit)
      from  45f7a6281a1f2a07b0f11ac79af72ccd7d8979a2 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
http://git.qos.ch/gitweb/?p=logback.git;a=commit;h=7c545298b251c2e1574029b945849816a8986332
http://github.com/ceki/logback/commit/7c545298b251c2e1574029b945849816a8986332

commit 7c545298b251c2e1574029b945849816a8986332
Author: Ceki Gulcu <ceki at qos.ch>
Date:   Sat Apr 3 18:27:59 2010 +0200

    Fixed  	 LBCORE-148

diff --git a/logback-classic/src/test/java/ch/qos/logback/classic/net/SocketAppenderTest.java b/logback-classic/src/test/java/ch/qos/logback/classic/net/SocketAppenderTest.java
index aaecb2c..f3b471b 100644
--- a/logback-classic/src/test/java/ch/qos/logback/classic/net/SocketAppenderTest.java
+++ b/logback-classic/src/test/java/ch/qos/logback/classic/net/SocketAppenderTest.java
@@ -31,6 +31,8 @@ import ch.qos.logback.classic.LoggerContext;
 import ch.qos.logback.classic.spi.ILoggingEvent;
 import ch.qos.logback.classic.spi.LoggerContextVO;
 import ch.qos.logback.core.read.ListAppender;
+import ch.qos.logback.core.recovery.RecoveryCoordinator;
+import ch.qos.logback.core.status.OnConsoleStatusListener;
 import ch.qos.logback.core.util.StatusPrinter;
 
 public class SocketAppenderTest {
@@ -40,8 +42,8 @@ public class SocketAppenderTest {
   static final int SLEEP_AFTER_LOG = 100;
 
   int port = 4561;
-  LoggerContext lc = new LoggerContext();
-  LoggerContext serverLC = new LoggerContext();
+  LoggerContext context = new LoggerContext();
+  LoggerContext serverContext = new LoggerContext();
   ListAppender<ILoggingEvent> la = new ListAppender<ILoggingEvent>();
   SocketAppender socketAppender = new SocketAppender();
   private boolean includeCallerData = false;
@@ -50,10 +52,11 @@ public class SocketAppenderTest {
   @Test
   public void startFailNoRemoteHost() {
     SocketAppender appender = new SocketAppender();
-    appender.setContext(lc);
+    appender.setContext(context);
     appender.setPort(123);
     appender.start();
-    assertEquals(1, lc.getStatusManager().getCount());
+    StatusPrinter.print(context);
+    assertEquals(1, context.getStatusManager().getCount());
   }
 
   @Test
@@ -62,7 +65,7 @@ public class SocketAppenderTest {
     waitForServerToStart();
     configureClient();
 
-    Logger logger = lc.getLogger(Logger.ROOT_LOGGER_NAME);
+    Logger logger = context.getLogger(Logger.ROOT_LOGGER_NAME);
     logger.debug("test msg");
 
     Thread.sleep(SLEEP_AFTER_LOG);
@@ -84,7 +87,7 @@ public class SocketAppenderTest {
     waitForServerToStart();
     configureClient();
 
-    Logger logger = lc.getLogger(Logger.ROOT_LOGGER_NAME);
+    Logger logger = context.getLogger(Logger.ROOT_LOGGER_NAME);
     logger.debug("test msg");
     Thread.sleep(SLEEP_AFTER_LOG);
 
@@ -114,7 +117,7 @@ public class SocketAppenderTest {
     waitForServerToStart();
     configureClient();
 
-    Logger logger = lc.getLogger(Logger.ROOT_LOGGER_NAME);
+    Logger logger = context.getLogger(Logger.ROOT_LOGGER_NAME);
 
     MDC.put("key", "testValue");
     logger.debug("test msg");
@@ -140,7 +143,7 @@ public class SocketAppenderTest {
     waitForServerToStart();
     configureClient();
 
-    Logger logger = lc.getLogger(Logger.ROOT_LOGGER_NAME);
+    Logger logger = context.getLogger(Logger.ROOT_LOGGER_NAME);
     logger.debug("test msg");
 
     Thread.sleep(SLEEP_AFTER_LOG);
@@ -162,7 +165,7 @@ public class SocketAppenderTest {
     // Thread.sleep(SLEEP_AFTER_SERVER_START);
     configureClient();
 
-    Logger logger = lc.getLogger(Logger.ROOT_LOGGER_NAME);
+    Logger logger = context.getLogger(Logger.ROOT_LOGGER_NAME);
 
     Marker marker = MarkerFactory.getMarker("testMarker");
     logger.debug(marker, "test msg");
@@ -184,7 +187,7 @@ public class SocketAppenderTest {
 
     configureClient();
 
-    Logger logger = lc.getLogger(Logger.ROOT_LOGGER_NAME);
+    Logger logger = context.getLogger(Logger.ROOT_LOGGER_NAME);
 
     MDC.put("key", "testValue");
     logger.debug("test msg");
@@ -209,28 +212,30 @@ public class SocketAppenderTest {
 
   @Test
   public void lateServerLaunch() throws InterruptedException {
-    // FIXME
-    //socketAppender.setReconnectionDelay(20);
     configureClient();
-    Logger logger = lc.getLogger(Logger.ROOT_LOGGER_NAME);
+    context.getStatusManager().add(new OnConsoleStatusListener());
+    
+    Logger logger = context.getLogger(Logger.ROOT_LOGGER_NAME);
     logger.debug("test msg");
 
     fireServer();
     waitForServerToStart();
-    Thread.sleep(SLEEP_AFTER_LOG); // allow time for client and server to
-                                    // connect
-    logger.debug("test msg 2");
+    System.out.println("Server started");
+    Thread.sleep(RecoveryCoordinator.BACKOFF_COEFFICIENT_MIN+10); 
+    
+    logger.debug("test msg 2"); // trigger connection establishment 
+    logger.debug("test msg 3");
     Thread.sleep(SLEEP_AFTER_LOG);
 
     simpleSocketServer.close();
     Thread.sleep(SLEEP_AFTER_LOG);
     simpleSocketServer.join(JOIN_OR_WAIT_TIMEOUT);
-    StatusPrinter.print(lc);
+    //StatusPrinter.print(context);
     assertTrue(simpleSocketServer.isClosed());
     assertEquals(1, la.list.size());
 
     ILoggingEvent remoteEvent = la.list.get(0);
-    assertEquals("test msg 2", remoteEvent.getMessage());
+    assertEquals("test msg 3", remoteEvent.getMessage());
     assertEquals(Level.DEBUG, remoteEvent.getLevel());
   }
 
@@ -241,27 +246,27 @@ public class SocketAppenderTest {
   }
 
   private void fireServer() throws InterruptedException {
-    Logger root = serverLC.getLogger("root");
+    Logger root = serverContext.getLogger("root");
     la.setName(LIST_APPENDER_NAME);
-    la.setContext(serverLC);
+    la.setContext(serverContext);
     la.start();
     root.addAppender(la);
-    simpleSocketServer = new SimpleSocketServer(serverLC, port);
+    simpleSocketServer = new SimpleSocketServer(serverContext, port);
     simpleSocketServer.start();
     Thread.yield();
   }
 
   ListAppender<ILoggingEvent> getListAppender() {
-    Logger root = serverLC.getLogger("root");
+    Logger root = serverContext.getLogger("root");
     return (ListAppender<ILoggingEvent>) root.getAppender(LIST_APPENDER_NAME);
   }
 
   private void configureClient() {
-    lc = new LoggerContext();
-    lc.setName("test");
-    lc.putProperty("testKey", "testValue");
-    Logger root = lc.getLogger(Logger.ROOT_LOGGER_NAME);
-    socketAppender.setContext(lc);
+    context = new LoggerContext();
+    context.setName("test");
+    context.putProperty("testKey", "testValue");
+    Logger root = context.getLogger(Logger.ROOT_LOGGER_NAME);
+    socketAppender.setContext(context);
     socketAppender.setName("socket");
     socketAppender.setPort(port);
     socketAppender.setRemoteHost("localhost");
diff --git a/logback-core/src/main/java/ch/qos/logback/core/encoder/ObjectOutputStreamEncoder.java b/logback-core/src/main/java/ch/qos/logback/core/encoder/ObjectOutputStreamEncoder.java
index 3fa485d..e81cd94 100644
--- a/logback-core/src/main/java/ch/qos/logback/core/encoder/ObjectOutputStreamEncoder.java
+++ b/logback-core/src/main/java/ch/qos/logback/core/encoder/ObjectOutputStreamEncoder.java
@@ -18,18 +18,30 @@ import java.io.ObjectOutputStream;
 import java.io.OutputStream;
 
 import ch.qos.logback.core.CoreConstants;
+import ch.qos.logback.core.recovery.ResilientOutputStreamListener;
 
-public class ObjectOutputStreamEncoder<E> extends EncoderBase<E> {
+public class ObjectOutputStreamEncoder<E> extends EncoderBase<E> implements
+    ResilientOutputStreamListener {
 
   ObjectOutputStream oos;
+  OutputStream os;
   protected int counter = 0;
-
+  
+  boolean presumedInError = false;
+  
   @Override
   public void init(OutputStream os) throws IOException {
+    this.os = os;
     oos = new ObjectOutputStream(os);
   }
 
   public void doEncode(E event) throws IOException {
+    // if in error then provoke recovery
+    if (presumedInError) {
+      os.write(0);
+      return;
+    }
+    
     oos.writeObject(event);
     oos.flush();
     if (++counter >= CoreConstants.OOS_RESET_FREQUENCY) {
@@ -41,8 +53,27 @@ public class ObjectOutputStreamEncoder<E> extends EncoderBase<E> {
 
   }
 
-  public void close() throws IOException {
-    oos.close();
+  public void close() {
+    if (oos == null) {
+      return;
+    }
+    try {
+      oos.close();
+    } catch (IOException e) {
+
+    }
   }
 
+  public void outputStreamChangedEvent(OutputStream os) {
+    try {
+      this.os = os;
+      oos = new ObjectOutputStream(os);
+      presumedInError = false;
+    } catch (IOException e) {
+    }
+  }
+
+  public void presumedInError() {
+    presumedInError = true;
+  }
 }
diff --git a/logback-core/src/main/java/ch/qos/logback/core/net/SocketAppenderBase.java b/logback-core/src/main/java/ch/qos/logback/core/net/SocketAppenderBase.java
index 008806d..a8eadde 100644
--- a/logback-core/src/main/java/ch/qos/logback/core/net/SocketAppenderBase.java
+++ b/logback-core/src/main/java/ch/qos/logback/core/net/SocketAppenderBase.java
@@ -15,12 +15,12 @@
 package ch.qos.logback.core.net;
 
 import java.io.IOException;
-import java.io.ObjectOutputStream;
 import java.io.Serializable;
 import java.net.InetAddress;
 
-import ch.qos.logback.core.AppenderBase;
-import ch.qos.logback.core.CoreConstants;
+import ch.qos.logback.core.UnsynchronizedAppenderBase;
+import ch.qos.logback.core.encoder.ObjectOutputStreamEncoder;
+import ch.qos.logback.core.recovery.ResilientSocketStream;
 import ch.qos.logback.core.spi.PreSerializationTransformer;
 
 /**
@@ -31,7 +31,8 @@ import ch.qos.logback.core.spi.PreSerializationTransformer;
  * @author S&eacute;bastien Pennec
  */
 
-public abstract class SocketAppenderBase<E> extends AppenderBase<E> {
+public abstract class SocketAppenderBase<E> extends
+    UnsynchronizedAppenderBase<E> {
 
   /**
    * The default port number of remote logging server (4560).
@@ -39,45 +40,51 @@ public abstract class SocketAppenderBase<E> extends AppenderBase<E> {
   static final int DEFAULT_PORT = 4560;
 
   /**
-   * The default reconnection delay (30000 milliseconds or 30 seconds).
-   */
-  static final int DEFAULT_RECONNECTION_DELAY = 30000;
-
-  /**
    * We remember host name as String in addition to the resolved InetAddress so
    * that it can be returned via getOption().
    */
   protected String host;
 
   protected int port = DEFAULT_PORT;
-  protected ObjectOutputStream oos;
-  protected int reconnectionDelay = DEFAULT_RECONNECTION_DELAY;
 
-  protected int counter = 0;
+  ObjectOutputStreamEncoder<Serializable> encoder = new ObjectOutputStreamEncoder<Serializable>();
 
   /**
    * Start this appender.
    */
   public void start() {
-    int errorCount = 0;
-    if (port == 0) {
-      errorCount++;
-      addError("No port was configured for appender"
-          + name
-          + " For more information, please visit http://logback.qos.ch/codes.html#socket_no_port");
-    }
+    InetAddress inetAddress = null;
 
     if (host == null) {
-      errorCount++;
       addError("No remote address was configured for appender"
           + name
           + " For more information, please visit http://logback.qos.ch/codes.html#socket_no_host");
+      return;
+    } else {
+      inetAddress = getAddressByName(host);
+      if (inetAddress == null) {
+        return;
+      }
     }
 
-    //connect(address, port);
+    ResilientSocketStream ros = new ResilientSocketStream(inetAddress, port,
+        encoder, context);
+
+    try {
+      encoder.init(ros);
+    } catch (IOException e) {
+      ros.addError("Failed to open [" + inetAddress.getHostName() + ":" + port
+          + "]", e);
+    }
+    super.start();
+  }
 
-    if (errorCount == 0) {
-      this.started = true;
+  InetAddress getAddressByName(String host) {
+    try {
+      return InetAddress.getByName(host);
+    } catch (Exception e) {
+      addError("Could not find address of [" + host + "].", e);
+      return null;
     }
   }
 
@@ -93,78 +100,29 @@ public abstract class SocketAppenderBase<E> extends AppenderBase<E> {
     if (!isStarted())
       return;
 
+    encoder.stop();
     this.started = false;
-    cleanUp();
-  }
-
-  /**
-   * Drop the connection to the remote host and release the underlying connector
-   * thread if it has been created
-   */
-  public void cleanUp() {
-    if (oos != null) {
-      try {
-        oos.close();
-      } catch (IOException e) {
-        addError("Could not close oos.", e);
-      }
-      oos = null;
-    }
   }
 
-
   @Override
   protected void append(E event) {
-
     if (event == null)
       return;
+    if (!isStarted()) {
+      return;
+    }
 
-//    if (address == null) {
-//      addError("No remote host is set for SocketAppender named \""
-//          + this.name
-//          + "\". For more information, please visit http://logback.qos.ch/codes.html#socket_no_host");
-//      return;
-//    }
-
-    if (oos != null) {
-      try {
-        postProcessEvent(event);
-        Serializable serEvent = getPST().transform(event);
-        oos.writeObject(serEvent);
-        oos.flush();
-        if (++counter >= CoreConstants.OOS_RESET_FREQUENCY) {
-          counter = 0;
-          // Failing to reset the object output stream every now and
-          // then creates a serious memory leak.
-          // System.err.println("Doing oos.reset()");
-          oos.reset();
-        }
-      } catch (IOException e) {
-        if (oos != null) {
-          try {
-            oos.close();
-          } catch (IOException ignore) {
-          }
-        }
-
-        oos = null;
-        addWarn("Detected problem with connection: " + e);
-      }
+    try {
+      postProcessEvent(event);
+      Serializable serEvent = getPST().transform(event);
+      encoder.doEncode(serEvent);
+    } catch (IOException e) {
     }
   }
 
   protected abstract void postProcessEvent(E event);
-  protected abstract PreSerializationTransformer<E> getPST();
-
 
-  protected static InetAddress getAddressByName(String host) {
-    try {
-      return InetAddress.getByName(host);
-    } catch (Exception e) {
-      // addError("Could not find address of [" + host + "].", e);
-      return null;
-    }
-  }
+  protected abstract PreSerializationTransformer<E> getPST();
 
   /**
    * The <b>RemoteHost</b> option takes a string value which should be the host
@@ -182,8 +140,8 @@ public abstract class SocketAppenderBase<E> extends AppenderBase<E> {
   }
 
   /**
-   * The <b>Port</b> option takes a positive integer representing the port
-   * where the server is waiting for connections.
+   * The <b>Port</b> option takes a positive integer representing the port where
+   * the server is waiting for connections.
    */
   public void setPort(int port) {
     this.port = port;
@@ -195,6 +153,5 @@ public abstract class SocketAppenderBase<E> extends AppenderBase<E> {
   public int getPort() {
     return port;
   }
-  
 
 }
diff --git a/logback-core/src/main/java/ch/qos/logback/core/recovery/ResilientOutputStreamBase.java b/logback-core/src/main/java/ch/qos/logback/core/recovery/ResilientOutputStreamBase.java
index 9eaefbf..83f3f70 100644
--- a/logback-core/src/main/java/ch/qos/logback/core/recovery/ResilientOutputStreamBase.java
+++ b/logback-core/src/main/java/ch/qos/logback/core/recovery/ResilientOutputStreamBase.java
@@ -34,7 +34,7 @@ abstract public class ResilientOutputStreamBase extends OutputStream implements
   private int noContextWarning = 0;
   private int statusCount = 0;
 
-  private RecoveryCoordinator recoveryCoordinator;
+  protected RecoveryCoordinator recoveryCoordinator;
 
   protected OutputStream os;
   protected boolean presumedClean = true;
@@ -42,7 +42,7 @@ abstract public class ResilientOutputStreamBase extends OutputStream implements
   private ContextAwareImpl cai = new ContextAwareImpl(this);
 
   List<ResilientOutputStreamListener> listenerList = new ArrayList<ResilientOutputStreamListener>();
-  
+
   final private boolean isPresumedInError() {
     // existence of recoveryCoordinator indicates failed state
     return (recoveryCoordinator != null && !presumedClean);
@@ -111,6 +111,7 @@ abstract public class ResilientOutputStreamBase extends OutputStream implements
     presumedClean = false;
     if (recoveryCoordinator == null) {
       recoveryCoordinator = new RecoveryCoordinator();
+      firePresumedInErrorChangedEvent();
     }
   }
 
@@ -140,17 +141,24 @@ abstract public class ResilientOutputStreamBase extends OutputStream implements
           + getDescription(), this, e));
     }
   }
-  
+
   void fireOutputStreamChangedEvent() {
-    for(ResilientOutputStreamListener listener: listenerList) {
-      listener.outputStreamChangedEvent();
+    for (ResilientOutputStreamListener listener : listenerList) {
+      listener.outputStreamChangedEvent(this);
     }
   }
 
-  void addResilientOutputStreamListener(ResilientOutputStreamListener listener) {
+  void firePresumedInErrorChangedEvent() {
+    for (ResilientOutputStreamListener listener : listenerList) {
+      listener.presumedInError();
+    }
+  }
+
+  public void addResilientOutputStreamListener(
+      ResilientOutputStreamListener listener) {
     listenerList.add(listener);
   }
-  
+
   void addStatusIfCountNotOverLimit(Status s) {
     ++statusCount;
     if (statusCount < STATUS_COUNT_LIMIT) {
@@ -171,7 +179,7 @@ abstract public class ResilientOutputStreamBase extends OutputStream implements
       }
       return;
     }
-    
+
     StatusManager sm = cai.getStatusManager();
     if (sm != null) {
       sm.add(status);
@@ -179,7 +187,7 @@ abstract public class ResilientOutputStreamBase extends OutputStream implements
   }
 
   public Context getContext() {
-    return  cai.getContext();
+    return cai.getContext();
   }
 
   public void setContext(Context context) {
@@ -196,7 +204,6 @@ abstract public class ResilientOutputStreamBase extends OutputStream implements
 
   public void addInfo(String msg) {
     cai.addInfo(msg);
-    
   }
 
   public void addInfo(String msg, Throwable ex) {
diff --git a/logback-core/src/main/java/ch/qos/logback/core/recovery/ResilientOutputStreamListener.java b/logback-core/src/main/java/ch/qos/logback/core/recovery/ResilientOutputStreamListener.java
index ba5b0b1..66ddcb3 100644
--- a/logback-core/src/main/java/ch/qos/logback/core/recovery/ResilientOutputStreamListener.java
+++ b/logback-core/src/main/java/ch/qos/logback/core/recovery/ResilientOutputStreamListener.java
@@ -13,12 +13,15 @@
  */
 package ch.qos.logback.core.recovery;
 
+import java.io.OutputStream;
+
 public interface ResilientOutputStreamListener {
 
   /**
    * ResilientOutputStream instance will fire this event each time the
    * underlying output stream of the instance is changed.
    */
-  void outputStreamChangedEvent();
-
+  void outputStreamChangedEvent(OutputStream os);
+  
+  void presumedInError();
 }
diff --git a/logback-core/src/main/java/ch/qos/logback/core/recovery/ResilientSocketStream.java b/logback-core/src/main/java/ch/qos/logback/core/recovery/ResilientSocketStream.java
index cf5a671..9e4ec40 100644
--- a/logback-core/src/main/java/ch/qos/logback/core/recovery/ResilientSocketStream.java
+++ b/logback-core/src/main/java/ch/qos/logback/core/recovery/ResilientSocketStream.java
@@ -21,47 +21,58 @@ import java.net.Socket;
 import ch.qos.logback.core.Context;
 import ch.qos.logback.core.spi.ContextAware;
 
-public class ResilientSocketStream extends ResilientOutputStreamBase implements ContextAware {
+public class ResilientSocketStream extends ResilientOutputStreamBase implements
+    ContextAware {
 
-  String host;
   int port;
-  Context context;
   InetAddress inetAddress;
-  
-  public ResilientSocketStream(String host, int port)
-      throws IOException {
+
+  public ResilientSocketStream(InetAddress inetAddress, int port) {
     super();
-    this.host = host;
+    this.inetAddress = inetAddress;
     this.port = port;
-    super.os = openNewOutputStream();
-    this.presumedClean = true;
+    try {
+      this.os = openNewOutputStream();
+      this.presumedClean = true;
+    } catch (IOException e) {
+      postIOFailure(e);
+    }
   }
 
-  protected InetAddress getAddressByName(String host) {
+  public ResilientSocketStream(InetAddress inetAddress, int port, ResilientOutputStreamListener listener, Context context) {
+    super();
+    this.inetAddress = inetAddress;
+    this.port = port;
+    setContext(context);
+    addResilientOutputStreamListener(listener);
     try {
-      return InetAddress.getByName(host);
-    } catch (Exception e) {
-      addError("Could not find address of [" + host + "].", e);
-      return null;
+      this.os = openNewOutputStream();
+      this.presumedClean = true;
+    } catch (IOException e) {
+      postIOFailure(e);
     }
   }
+
   
   
+  final public boolean isPresumedInError() {
+    return (recoveryCoordinator != null && !presumedClean);
+  }
+
   @Override
   String getDescription() {
-    return "socket stream ["+host+":"+port+"]";
+    return "socket stream [" + inetAddress.getHostName() + ":" + port + "]";
   }
 
   @Override
-  OutputStream openNewOutputStream() throws IOException {
+  public OutputStream openNewOutputStream() throws IOException {
     Socket socket = new Socket(inetAddress, port);
-    return  socket.getOutputStream();
+    return socket.getOutputStream();
   }
-  
+
   @Override
   public String toString() {
     return "c.q.l.c.recovery.ResilientSocketStream@"
         + System.identityHashCode(this);
   }
- 
 }
diff --git a/logback-core/src/main/java/ch/qos/logback/core/status/OnConsoleStatusListener.java b/logback-core/src/main/java/ch/qos/logback/core/status/OnConsoleStatusListener.java
index 9b6ea49..f34e59b 100644
--- a/logback-core/src/main/java/ch/qos/logback/core/status/OnConsoleStatusListener.java
+++ b/logback-core/src/main/java/ch/qos/logback/core/status/OnConsoleStatusListener.java
@@ -28,5 +28,6 @@ public class OnConsoleStatusListener implements StatusListener {
     StringBuilder sb = new StringBuilder();
     StatusPrinter.buildStr(sb, "", status);
     System.out.print(sb);
+    System.out.flush();
   }
 }

-----------------------------------------------------------------------

Summary of changes:
 .../logback/classic/net/SocketAppenderTest.java    |   59 +++++----
 .../core/encoder/ObjectOutputStreamEncoder.java    |   39 ++++++-
 .../qos/logback/core/net/SocketAppenderBase.java   |  127 +++++++-------------
 .../core/recovery/ResilientOutputStreamBase.java   |   27 +++--
 .../recovery/ResilientOutputStreamListener.java    |    7 +-
 .../core/recovery/ResilientSocketStream.java       |   49 +++++---
 .../core/status/OnConsoleStatusListener.java       |    1 +
 7 files changed, 162 insertions(+), 147 deletions(-)


hooks/post-receive
-- 
Logback: the generic, reliable, fast and flexible logging framework.


More information about the logback-dev mailing list