diff --git a/logback-core/src/main/java/ch/qos/logback/core/AsyncAppenderBase.java b/logback-core/src/main/java/ch/qos/logback/core/AsyncAppenderBase.java index 8718737..6b00ec8 100644 --- a/logback-core/src/main/java/ch/qos/logback/core/AsyncAppenderBase.java +++ b/logback-core/src/main/java/ch/qos/logback/core/AsyncAppenderBase.java @@ -51,6 +51,7 @@ public class AsyncAppenderBase extends UnsynchronizedAppenderBase implemen static final int UNDEFINED = -1; int discardingThreshold = UNDEFINED; + boolean neverBlock = false; Worker worker = new Worker(); @@ -135,9 +136,13 @@ public class AsyncAppenderBase extends UnsynchronizedAppenderBase implemen } private void put(E eventObject) { - try { - blockingQueue.put(eventObject); - } catch (InterruptedException e) { + if (neverBlock) { + blockingQueue.offer(eventObject); + } else { + try { + blockingQueue.put(eventObject); + } catch (InterruptedException e) { + } } } @@ -166,6 +171,14 @@ public class AsyncAppenderBase extends UnsynchronizedAppenderBase implemen return blockingQueue.size(); } + + public void setNeverBlock(boolean neverBlock) { + this.neverBlock = neverBlock; + } + public boolean getNeverBlock() { + return neverBlock; + } + /** * The remaining capacity available in the blocking queue. * diff --git a/logback-core/src/test/java/ch/qos/logback/core/AsyncAppenderBaseTest.java b/logback-core/src/test/java/ch/qos/logback/core/AsyncAppenderBaseTest.java index ddf8cfd..477d359 100755 --- a/logback-core/src/test/java/ch/qos/logback/core/AsyncAppenderBaseTest.java +++ b/logback-core/src/test/java/ch/qos/logback/core/AsyncAppenderBaseTest.java @@ -56,6 +56,7 @@ public class AsyncAppenderBaseTest { delayingListAppender.setContext(context); delayingListAppender.setName("list"); + delayingListAppender.setDelay(5); delayingListAppender.start(); } @@ -120,6 +121,24 @@ public class AsyncAppenderBaseTest { } @Test(timeout = 2000) + public void eventLossIfNeverBlock() { + int bufferSize = 10; + int loopLen = bufferSize * 2; + delayingListAppender.setDelay(5000); // something greater than the test timeout + asyncAppenderBase.addAppender(delayingListAppender); + asyncAppenderBase.setQueueSize(bufferSize); + asyncAppenderBase.setNeverBlock(true); + asyncAppenderBase.start(); + for (int i = 0; i < loopLen; i++) { + asyncAppenderBase.doAppend(i); + } + asyncAppenderBase.stop(); + // ListAppender size isn't a reliable test here, so just make sure we didn't + // have any errors, and that we could complete the test in time. + statusChecker.assertIsErrorFree(); + } + + @Test(timeout = 2000) public void lossyAppenderShouldOnlyLooseCertainEvents() { int bufferSize = 5; int loopLen = bufferSize * 2; diff --git a/logback-core/src/test/java/ch/qos/logback/core/testUtil/DelayingListAppender.java b/logback-core/src/test/java/ch/qos/logback/core/testUtil/DelayingListAppender.java index f180070..551f957 100644 --- a/logback-core/src/test/java/ch/qos/logback/core/testUtil/DelayingListAppender.java +++ b/logback-core/src/test/java/ch/qos/logback/core/testUtil/DelayingListAppender.java @@ -20,6 +20,10 @@ public class DelayingListAppender extends ListAppender { public int delay = 5; public boolean interrupted = false; + public void setDelay(int ms) { + delay = ms; + } + @Override public void append(E e) { try {