Skip to content

Commit d9da7af

Browse files
committed
tentative fix for LOGBACK-1713
Signed-off-by: Ceki Gulcu <ceki@qos.ch>
1 parent 93443be commit d9da7af

File tree

4 files changed

+59
-1
lines changed

4 files changed

+59
-1
lines changed
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
<?xml version="1.0" encoding="UTF-8" ?>
2+
<!DOCTYPE configuration>
3+
4+
<configuration debug="false">
5+
6+
<if condition='property("HOSTNAME") != null'>
7+
<then>
8+
<appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender">
9+
10+
<discriminator>
11+
<key>userid</key>
12+
<defaultValue>ifThenDefault</defaultValue>
13+
</discriminator>
14+
<sift>
15+
<appender name="list-${userid}"
16+
class="ch.qos.logback.core.read.ListAppender"/>
17+
</sift>
18+
</appender>
19+
</then>
20+
</if>
21+
22+
<root level="DEBUG">
23+
<appender-ref ref="SIFT"/>
24+
</root>
25+
26+
</configuration>

logback-classic-blackbox/src/test/java/ch/qos/logback/classic/blackbox/joran/conditional/ConditionalTest.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,14 @@
1717
import ch.qos.logback.classic.LoggerContext;
1818
import ch.qos.logback.classic.blackbox.BlackboxClassicTestConstants;
1919
import ch.qos.logback.classic.joran.JoranConfigurator;
20+
import ch.qos.logback.classic.sift.SiftingAppender;
2021
import ch.qos.logback.classic.spi.ILoggingEvent;
22+
import ch.qos.logback.core.Appender;
2123
import ch.qos.logback.core.ConsoleAppender;
2224
import ch.qos.logback.core.FileAppender;
2325
import ch.qos.logback.core.joran.spi.JoranException;
2426
import ch.qos.logback.core.read.ListAppender;
27+
import ch.qos.logback.core.sift.AppenderTracker;
2528
import ch.qos.logback.core.status.StatusUtil;
2629
import ch.qos.logback.core.testUtil.CoreTestConstants;
2730
import ch.qos.logback.core.testUtil.RandomUtil;
@@ -33,7 +36,9 @@
3336
import java.io.IOException;
3437
import java.net.InetAddress;
3538
import java.net.UnknownHostException;
39+
import java.util.List;
3640

41+
import static org.junit.jupiter.api.Assertions.assertEquals;
3742
import static org.junit.jupiter.api.Assertions.assertNotNull;
3843
import static org.junit.jupiter.api.Assertions.assertNull;
3944
import static org.junit.jupiter.api.Assertions.assertTrue;
@@ -43,6 +48,8 @@ public class ConditionalTest {
4348
LoggerContext context = new LoggerContext();
4449
Logger root = context.getLogger(Logger.ROOT_LOGGER_NAME);
4550

51+
Logger logger = context.getLogger(this.getClass().getName());
52+
4653
StatusUtil checker = new StatusUtil(context);
4754
int diff = RandomUtil.getPositiveInt();
4855
String randomOutputDir = CoreTestConstants.OUTPUT_DIR_PREFIX + diff + "/";
@@ -142,4 +149,24 @@ public void conditionalInclusionWithInexistentFile() throws JoranException, IOEx
142149
assertTrue(checker.isErrorFree(0));
143150
}
144151

152+
private AppenderTracker<ILoggingEvent> getAppenderTracker() {
153+
SiftingAppender ha = (SiftingAppender) root.getAppender("SIFT");
154+
return ha.getAppenderTracker();
155+
}
156+
157+
// see also https://jira.qos.ch/browse/LOGBACK-1713
158+
@Test
159+
public void nestedWithinIfThen() throws JoranException {
160+
configure(BlackboxClassicTestConstants.JORAN_INPUT_PREFIX + "conditional/siftNestedWithinIfThen.xml");
161+
StatusPrinter.print(context);
162+
String msg = "nestedWithinIfThen";
163+
logger.debug(msg);
164+
Appender<ILoggingEvent> appender = getAppenderTracker().find("ifThenDefault");
165+
assertNotNull(appender);
166+
ListAppender<ILoggingEvent> listAppender = (ListAppender<ILoggingEvent>) appender;
167+
List<ILoggingEvent> eventList = listAppender.list;
168+
assertEquals(1, listAppender.list.size());
169+
assertEquals(msg, eventList.get(0).getMessage());
170+
checker.isWarningOrErrorFree(0);
171+
}
145172
}

logback-core/src/main/java/ch/qos/logback/core/joran/JoranConfiguratorBase.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ protected void addElementSelectorAndActionAssociations(RuleStore rs) {
9090
rs.addRule(new ElementSelector("*/if/else"), ElseAction::new);
9191
rs.addTransparentPathPart("else");
9292

93-
rs.addRule(new ElementSelector("configuration/appender/sift"), SiftAction::new);
93+
rs.addRule(new ElementSelector("*/appender/sift"), SiftAction::new);
9494
rs.addTransparentPathPart("sift");
9595

9696

logback-core/src/main/java/ch/qos/logback/core/model/processor/conditional/IfModelHandler.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,11 @@ public void handle(ModelInterpretationContext mic, Model model) throws ModelHand
101101
@Override
102102
public void postHandle(ModelInterpretationContext mic, Model model) throws ModelHandlerException {
103103

104+
if(mic.isModelStackEmpty()) {
105+
addError("Unexpected unexpected empty model stack.");
106+
return;
107+
}
108+
104109
Object o = mic.peekModel();
105110
if (o != ifModel) {
106111
addWarn("The object [" + o + "] on the top the of the stack is not the expected [" + ifModel);

0 commit comments

Comments
 (0)