diff --git a/logback-core/src/main/java/ch/qos/logback/core/joran/JoranConfiguratorBase.java b/logback-core/src/main/java/ch/qos/logback/core/joran/JoranConfiguratorBase.java index 662a9161b3..acf4c9bb6c 100644 --- a/logback-core/src/main/java/ch/qos/logback/core/joran/JoranConfiguratorBase.java +++ b/logback-core/src/main/java/ch/qos/logback/core/joran/JoranConfiguratorBase.java @@ -71,7 +71,7 @@ protected void addElementSelectorAndActionAssociations(RuleStore rs) { rs.addRule(new ElementSelector("configuration/statusListener"), StatusListenerAction::new); rs.addRule(new ElementSelector("*/appender"), AppenderAction::new); - rs.addRule(new ElementSelector("configuration/appender/appender-ref"), AppenderRefAction::new); + rs.addRule(new ElementSelector("*/appender/appender-ref"), AppenderRefAction::new); rs.addRule(new ElementSelector("configuration/newRule"), NewRuleAction::new); rs.addRule(new ElementSelector("*/param"), ParamAction::new); diff --git a/logback-core/src/main/java/ch/qos/logback/core/joran/JoranConstants.java b/logback-core/src/main/java/ch/qos/logback/core/joran/JoranConstants.java index 7ee9422775..843c2bdef7 100644 --- a/logback-core/src/main/java/ch/qos/logback/core/joran/JoranConstants.java +++ b/logback-core/src/main/java/ch/qos/logback/core/joran/JoranConstants.java @@ -45,5 +45,6 @@ public abstract class JoranConstants { public static final String APPENDER_BAG = "APPENDER_BAG"; public static final String APPENDER_REF_BAG = "APPENDER_REF_BAG"; + public static final String PARENT_APPENDER_BAG = "PARENT_APPENDER_BAG"; // public static final String FILTER_CHAIN_BAG = "FILTER_CHAIN_BAG"; } diff --git a/logback-core/src/main/java/ch/qos/logback/core/model/processor/AppenderRefModelHandler.java b/logback-core/src/main/java/ch/qos/logback/core/model/processor/AppenderRefModelHandler.java index 12e7318b8c..37bada04c2 100755 --- a/logback-core/src/main/java/ch/qos/logback/core/model/processor/AppenderRefModelHandler.java +++ b/logback-core/src/main/java/ch/qos/logback/core/model/processor/AppenderRefModelHandler.java @@ -50,9 +50,16 @@ void attachRefencedAppenders(ModelInterpretationContext mic, AppenderRefModel ap AppenderAttachable appenderAttachable) { String appenderName = mic.subst(appenderRefModel.getRef()); - Map appenderBag = (Map) mic.getObjectMap().get(JoranConstants.APPENDER_BAG); + Map appenderBag = (Map) mic.getObjectMap().get(JoranConstants.APPENDER_BAG); Appender appender = appenderBag.get(appenderName); + if (appender == null) { + Map parentAppenderBag = (Map) mic.getObjectMap().get(JoranConstants.PARENT_APPENDER_BAG); + if (parentAppenderBag) != null) { + appender = parentAppenderBag.get(appenderName); + } + } + if (appender == null) { addError("Failed to find appender named [" + appenderName + "]"); } else { diff --git a/logback-core/src/main/java/ch/qos/logback/core/model/processor/ModelInterpretationContext.java b/logback-core/src/main/java/ch/qos/logback/core/model/processor/ModelInterpretationContext.java index 4ddb6abeee..dcfc77f00d 100644 --- a/logback-core/src/main/java/ch/qos/logback/core/model/processor/ModelInterpretationContext.java +++ b/logback-core/src/main/java/ch/qos/logback/core/model/processor/ModelInterpretationContext.java @@ -85,6 +85,7 @@ public ModelInterpretationContext(ModelInterpretationContext otherMic) { variableSubstitutionsHelper = new VariableSubstitutionsHelper(context, otherMic.getCopyOfPropertyMap()); defaultNestedComponentRegistry.duplicate(otherMic.getDefaultNestedComponentRegistry()); createAppenderBags(); + objectMap.put(JoranConstants.PARENT_APPENDER_BAG, new HashMap>((Map>)otherMic.objectMap.get(JoranConstants.APPENDER_BAG))); } public Map getObjectMap() { diff --git a/logback-core/src/main/java/ch/qos/logback/core/sift/AppenderFactoryUsingSiftModel.java b/logback-core/src/main/java/ch/qos/logback/core/sift/AppenderFactoryUsingSiftModel.java index 210ec8f7a7..2fc55eee25 100644 --- a/logback-core/src/main/java/ch/qos/logback/core/sift/AppenderFactoryUsingSiftModel.java +++ b/logback-core/src/main/java/ch/qos/logback/core/sift/AppenderFactoryUsingSiftModel.java @@ -23,12 +23,14 @@ import ch.qos.logback.core.joran.spi.DefaultNestedComponentRegistry; import ch.qos.logback.core.joran.spi.JoranException; import ch.qos.logback.core.model.AppenderModel; +import ch.qos.logback.core.model.AppenderRefModel; import ch.qos.logback.core.model.ImplicitModel; import ch.qos.logback.core.model.Model; import ch.qos.logback.core.model.ParamModel; import ch.qos.logback.core.model.PropertyModel; import ch.qos.logback.core.model.SiftModel; import ch.qos.logback.core.model.processor.AppenderModelHandler; +import ch.qos.logback.core.model.processor.AppenderRefModelHandler; import ch.qos.logback.core.model.processor.ImplicitModelHandler; import ch.qos.logback.core.model.processor.ModelInterpretationContext; import ch.qos.logback.core.model.processor.PropertyModelHandler; @@ -67,6 +69,7 @@ public boolean hasDependers(String dependeeName) { siftProcessor.addHandler(PropertyModel.class, PropertyModelHandler::makeInstance); siftProcessor.addHandler(ImplicitModel.class, ImplicitModelHandler::makeInstance); siftProcessor.addHandler(AppenderModel.class, AppenderModelHandler::makeInstance); + siftProcessor.addHandler(AppenderRefModel.class, AppenderRefModelHandler::makeInstance); siftProcessor.addHandler(SiftModel.class, NOPSiftModelHandler::makeInstance); return siftProcessor;