Skip to content

Commit ddf8dd0

Browse files
committed
Fix appender-ref resolution in complex custom appenders inside SiftingAppender
Signed-off-by: Volodymyr Bolshutkin <[email protected]>
1 parent 02e7ef0 commit ddf8dd0

File tree

5 files changed

+14
-2
lines changed

5 files changed

+14
-2
lines changed

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
@@ -71,7 +71,7 @@ protected void addElementSelectorAndActionAssociations(RuleStore rs) {
7171
rs.addRule(new ElementSelector("configuration/statusListener"), StatusListenerAction::new);
7272

7373
rs.addRule(new ElementSelector("*/appender"), AppenderAction::new);
74-
rs.addRule(new ElementSelector("configuration/appender/appender-ref"), AppenderRefAction::new);
74+
rs.addRule(new ElementSelector("*/appender/appender-ref"), AppenderRefAction::new);
7575
rs.addRule(new ElementSelector("configuration/newRule"), NewRuleAction::new);
7676

7777
rs.addRule(new ElementSelector("*/param"), ParamAction::new);

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,5 +45,6 @@ public abstract class JoranConstants {
4545

4646
public static final String APPENDER_BAG = "APPENDER_BAG";
4747
public static final String APPENDER_REF_BAG = "APPENDER_REF_BAG";
48+
public static final String PARENT_APPENDER_BAG = "PARENT_APPENDER_BAG";
4849
// public static final String FILTER_CHAIN_BAG = "FILTER_CHAIN_BAG";
4950
}

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

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,16 @@ void attachRefencedAppenders(ModelInterpretationContext mic, AppenderRefModel ap
5050
AppenderAttachable<?> appenderAttachable) {
5151
String appenderName = mic.subst(appenderRefModel.getRef());
5252

53-
Map<String, Appender> appenderBag = (Map<String, Appender>) mic.getObjectMap().get(JoranConstants.APPENDER_BAG);
53+
Map<String, Appender> appenderBag = (Map<String, Appender>) mic.getObjectMap().get(JoranConstants.APPENDER_BAG);
5454

5555
Appender appender = appenderBag.get(appenderName);
56+
if (appender == null) {
57+
Map<String, Appender> parentAppenderBag = (Map<String, Appender>) mic.getObjectMap().get(JoranConstants.PARENT_APPENDER_BAG);
58+
if (parentAppenderBag) != null) {
59+
appender = parentAppenderBag.get(appenderName);
60+
}
61+
}
62+
5663
if (appender == null) {
5764
addError("Failed to find appender named [" + appenderName + "]");
5865
} else {

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ public ModelInterpretationContext(ModelInterpretationContext otherMic) {
8585
variableSubstitutionsHelper = new VariableSubstitutionsHelper(context, otherMic.getCopyOfPropertyMap());
8686
defaultNestedComponentRegistry.duplicate(otherMic.getDefaultNestedComponentRegistry());
8787
createAppenderBags();
88+
objectMap.put(JoranConstants.PARENT_APPENDER_BAG, new HashMap<String, Appender<?>>((Map<String, Appender<?>>)otherMic.objectMap.get(JoranConstants.APPENDER_BAG)));
8889
}
8990

9091
public Map<String, Object> getObjectMap() {

logback-core/src/main/java/ch/qos/logback/core/sift/AppenderFactoryUsingSiftModel.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,14 @@
2323
import ch.qos.logback.core.joran.spi.DefaultNestedComponentRegistry;
2424
import ch.qos.logback.core.joran.spi.JoranException;
2525
import ch.qos.logback.core.model.AppenderModel;
26+
import ch.qos.logback.core.model.AppenderRefModel;
2627
import ch.qos.logback.core.model.ImplicitModel;
2728
import ch.qos.logback.core.model.Model;
2829
import ch.qos.logback.core.model.ParamModel;
2930
import ch.qos.logback.core.model.PropertyModel;
3031
import ch.qos.logback.core.model.SiftModel;
3132
import ch.qos.logback.core.model.processor.AppenderModelHandler;
33+
import ch.qos.logback.core.model.processor.AppenderRefModelHandler;
3234
import ch.qos.logback.core.model.processor.ImplicitModelHandler;
3335
import ch.qos.logback.core.model.processor.ModelInterpretationContext;
3436
import ch.qos.logback.core.model.processor.PropertyModelHandler;
@@ -67,6 +69,7 @@ public boolean hasDependers(String dependeeName) {
6769
siftProcessor.addHandler(PropertyModel.class, PropertyModelHandler::makeInstance);
6870
siftProcessor.addHandler(ImplicitModel.class, ImplicitModelHandler::makeInstance);
6971
siftProcessor.addHandler(AppenderModel.class, AppenderModelHandler::makeInstance);
72+
siftProcessor.addHandler(AppenderRefModel.class, AppenderRefModelHandler::makeInstance);
7073
siftProcessor.addHandler(SiftModel.class, NOPSiftModelHandler::makeInstance);
7174

7275
return siftProcessor;

0 commit comments

Comments
 (0)