Skip to content

Commit 4f560a0

Browse files
committed
appender names of references not subject to substitution
Signed-off-by: ceki <ceki@qos.ch>
1 parent eab8e1d commit 4f560a0

4 files changed

Lines changed: 27 additions & 19 deletions

File tree

logback-classic/src/test/java/ch/qos/logback/classic/joran/JoranConfiguratorTest.java

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -179,26 +179,24 @@ public void appenderRefSettingBySystemProperty() throws JoranException {
179179
configure(ClassicTestConstants.JORAN_INPUT_PREFIX + "appenderRefByProperty.xml");
180180
final Logger logger = loggerContext.getLogger("ch.qos.logback.classic.joran");
181181
final ListAppender<ILoggingEvent> listAppender = (ListAppender<ILoggingEvent>) logger.getAppender("A");
182-
assertEquals(0, listAppender.list.size());
182+
// appender names or refs not subject to substitution
183+
assertNull(listAppender);
184+
183185
final String msg = "hello world";
184186
logger.info(msg);
185187

186-
assertEquals(1, listAppender.list.size());
187188
System.clearProperty(propertyName);
188189
}
190+
189191
@Test
190192
public void appenderRefSettingBySystemPropertyDefault() throws JoranException {
191193

192194
configure(ClassicTestConstants.JORAN_INPUT_PREFIX + "appenderRefByPropertyDefault.xml");
193-
StatusPrinter.print(loggerContext);
194195
final Logger logger = loggerContext.getLogger("ch.qos.logback.classic.joran");
195196
final ListAppender<ILoggingEvent> listAppender = (ListAppender<ILoggingEvent>) root.getAppender("A");
196-
assertNotNull(listAppender);
197-
assertEquals(0, listAppender.list.size());
198-
final String msg = "hello world";
199-
logger.info(msg);
197+
// appender names not subjected to substitution
198+
assertNull(listAppender);
200199

201-
assertEquals(1, listAppender.list.size());
202200
}
203201

204202

@@ -223,21 +221,20 @@ public void refToUndefinedAppender() throws JoranException {
223221
public void refViaDefaultSubstitution() throws JoranException {
224222

225223
configure(ClassicTestConstants.JORAN_INPUT_PREFIX + "refViaDefaultSubstitution.xml");
226-
StatusPrinter.print(loggerContext);
227224
final Logger logger = loggerContext.getLogger("ch.qos.logback.classic.joran");
228225
final ListAppender<ILoggingEvent> listAppender = (ListAppender<ILoggingEvent>) root.getAppender("A");
229226
final NOPAppender<ILoggingEvent> nopAppender = (NOPAppender) root.getAppender("NOP");
230227

231228
assertNotNull(listAppender);
232-
assertNotNull(nopAppender);
229+
assertNull(nopAppender);
233230

234231
assertEquals(0, listAppender.list.size());
235232
final String msg = "hello world";
236233
logger.info(msg);
237234

238235
assertEquals(1, listAppender.list.size());
239236

240-
checker.assertIsWarningOrErrorFree();
237+
checker.assertContainsMatch("Appender named \\[\\$\\{NONEXISTENT:-NOP\\}\\] could not be found.");
241238
}
242239

243240
@Test

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,8 @@ public void handle(ModelInterpretationContext mic, Model model) throws ModelHand
4747

4848
AppenderModel appenderModel = (AppenderModel) model;
4949

50-
String appenderName = mic.subst(appenderModel.getName());
50+
// appender names should not be subjected to substitution
51+
String appenderName = appenderModel.getName();
5152

5253
if (!mic.hasDependers(appenderName)) {
5354
addWarn("Appender named [" + appenderName + "] not referenced. Skipping further processing.");

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

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,21 @@
1414
package ch.qos.logback.core.model.processor;
1515

1616
import ch.qos.logback.core.Context;
17-
import ch.qos.logback.core.model.AppenderModel;
1817
import ch.qos.logback.core.model.AppenderRefModel;
1918
import ch.qos.logback.core.model.Model;
2019

2120
import java.util.List;
22-
import java.util.stream.Collectors;
2321

22+
/**
23+
* The AppenderRefDependencyAnalyser class is responsible for analyzing dependencies
24+
* related to appender references within a logging model. This class extends
25+
* ModelHandlerBase and operates during the dependency analysis phase of processing.
26+
*
27+
* The primary responsibilities of this class include:
28+
* - Identifying instances of {@link AppenderRefModel} within a model hierarchy.
29+
* - Substituting references to appender models using the context's interpretation logic.
30+
* - Adding dependency definitions for the identified appender references to the interpretation context.
31+
*/
2432
@PhaseIndicator(phase = ProcessingPhase.DEPENDENCY_ANALYSIS)
2533
public class AppenderRefDependencyAnalyser extends ModelHandlerBase {
2634

@@ -36,10 +44,11 @@ protected Class<Model> getSupportedModelClass() {
3644
@Override
3745
public void handle(ModelInterpretationContext mic, Model parentModel) throws ModelHandlerException {
3846
List<AppenderRefModel> appenderRefModelList = new java.util.ArrayList<>();
39-
getAllAppenderRefModels(appenderRefModelList, parentModel);
47+
collectAllAppenderRefModels(appenderRefModelList, parentModel);
4048

4149
for (AppenderRefModel appenderRefModel : appenderRefModelList) {
42-
String ref = mic.subst(appenderRefModel.getRef());
50+
// TODO: prevent substitution of references
51+
String ref = appenderRefModel.getRef();
4352
DependencyDefinition dd = new DependencyDefinition(parentModel, ref);
4453
mic.addDependencyDefinition(dd);
4554
}
@@ -53,13 +62,13 @@ public void handle(ModelInterpretationContext mic, Model parentModel) throws Mod
5362
* @param list the list to which AppenderRefModel instances are added
5463
* @param model the root Model object from which to start the extraction
5564
*/
56-
public void getAllAppenderRefModels(List<AppenderRefModel> list, Model model) {
65+
public void collectAllAppenderRefModels(List<AppenderRefModel> list, Model model) {
5766
if(model == null)
5867
return;
5968
if(model instanceof AppenderRefModel) {
6069
list.add((AppenderRefModel) model);
6170
}
62-
model.getSubModels().forEach(subModel -> getAllAppenderRefModels(list, subModel));
71+
model.getSubModels().forEach(subModel -> collectAllAppenderRefModels(list, subModel));
6372
}
6473

6574
}

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,8 @@ public void handle(ModelInterpretationContext interpContext, Model model) throws
6464
@SuppressWarnings({ "unchecked", "rawtypes" })
6565
void attachReferencedAppenders(ModelInterpretationContext mic, AppenderRefModel appenderRefModel,
6666
AppenderAttachable<?> appenderAttachable) {
67-
String appenderName = mic.subst(appenderRefModel.getRef());
67+
// appender ref should not be subject to substitution
68+
String appenderName = appenderRefModel.getRef();
6869

6970
if(!isAppenderDeclared(mic, appenderName)) {
7071
addWarn("Appender named [" + appenderName + "] could not be found. Skipping attachment to "+appenderAttachable+".");

0 commit comments

Comments
 (0)