From c6ed96347a1eed2d1242695e76bd07b969d8232b Mon Sep 17 00:00:00 2001 From: liliang <759628324@qq.com> Date: Thu, 2 Nov 2023 10:53:54 +0800 Subject: [PATCH] fix #725 Signed-off-by: liliang <759628324@qq.com> --- .../qos/logback/core/AsyncAppenderBase.java | 15 ++++-- .../logback/core/AsyncAppenderBaseTest.java | 52 +++++++++++++++++++ 2 files changed, 64 insertions(+), 3 deletions(-) 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); + + } + }