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 0b13be0086..94e6454ac1 100755
--- a/logback-core/src/main/java/ch/qos/logback/core/AsyncAppenderBase.java
+++ b/logback-core/src/main/java/ch/qos/logback/core/AsyncAppenderBase.java
@@ -240,7 +240,7 @@ public boolean isNeverBlock() {
/**
* The remaining capacity available in the blocking queue.
*
- * See also {@link java.util.concurrent.BlockingQueue#remainingCapacity()
+ * See also {@link BlockingQueue#remainingCapacity()
* BlockingQueue#remainingCapacity()}
*
* @return the remaining capacity
@@ -275,14 +275,23 @@ public boolean isAttached(Appender eAppender) {
public void detachAndStopAllAppenders() {
aai.detachAndStopAllAppenders();
+ appenderCount = 0;
}
public boolean detachAppender(Appender eAppender) {
- return aai.detachAppender(eAppender);
+ boolean detached = aai.detachAppender(eAppender);
+ if (detached) {
+ appenderCount --;
+ }
+ return detached;
}
public boolean detachAppender(String name) {
- return aai.detachAppender(name);
+ boolean detached = aai.detachAppender(name);
+ if (detached) {
+ appenderCount --;
+ }
+ return detached;
}
class Worker extends Thread {
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 6b9bd9a55c..a7b0765fe1 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
@@ -332,4 +332,56 @@ public void checkThatStartMethodIsIdempotent() {
// thread
asyncAppenderBase.start();
}
+
+ // AsyncAppenderBase can not addAppender after detachAppender
+ @Test
+ @Timeout(value=2, unit = TimeUnit.SECONDS)
+ public void appenderShouldBeAddedSuccessfullyAfterDetachedByReference() {
+ asyncAppenderBase.addAppender(listAppender);
+ asyncAppenderBase.start();
+ asyncAppenderBase.doAppend(0);
+ asyncAppenderBase.detachAppender(listAppender);
+ asyncAppenderBase.addAppender(listAppender);
+ asyncAppenderBase.doAppend(0);
+ asyncAppenderBase.stop();
+ verify(listAppender, 2);
+ }
+
+ @Test
+ @Timeout(value=2, unit = TimeUnit.SECONDS)
+ public void appenderShouldBeAddedSuccessfullyAfterDetachedByName() {
+ asyncAppenderBase.addAppender(listAppender);
+ asyncAppenderBase.start();
+ asyncAppenderBase.doAppend(0);
+ asyncAppenderBase.detachAppender("list");
+ asyncAppenderBase.addAppender(listAppender);
+ asyncAppenderBase.doAppend(0);
+ asyncAppenderBase.stop();
+ verify(listAppender, 2);
+ }
+
+ @Test
+ @Timeout(value=2, unit = TimeUnit.SECONDS)
+ public void appenderShouldBeAddedSuccessfullyAfterAllAppendersDetachedAndStopeed() throws InterruptedException {
+ asyncAppenderBase.addAppender(listAppender);
+ asyncAppenderBase.start();
+ asyncAppenderBase.doAppend(0);
+ TimeUnit.SECONDS.sleep(1);
+ asyncAppenderBase.detachAndStopAllAppenders();
+
+ ListAppender listAppender2 = new ListAppender();
+ listAppender2.setContext(context);
+ listAppender2.setName("list2");
+ listAppender2.start();
+
+ asyncAppenderBase.addAppender(listAppender2);
+ asyncAppenderBase.doAppend(0);
+
+ asyncAppenderBase.stop();
+
+ verify(listAppender, 1);
+ verify(listAppender2, 1);
+
+ }
+
}