1 package ch.qos.logback.classic.model.processor;
2
3 import static ch.qos.logback.core.joran.JoranConstants.NULL;
4
5 import ch.qos.logback.classic.Level;
6 import ch.qos.logback.classic.Logger;
7 import ch.qos.logback.classic.LoggerContext;
8 import ch.qos.logback.classic.model.LoggerModel;
9 import ch.qos.logback.core.Context;
10 import ch.qos.logback.core.joran.JoranConstants;
11 import ch.qos.logback.core.model.Model;
12 import ch.qos.logback.core.model.processor.ModelHandlerBase;
13 import ch.qos.logback.core.model.processor.ModelHandlerException;
14 import ch.qos.logback.core.model.processor.ModelInterpretationContext;
15 import ch.qos.logback.core.spi.ErrorCodes;
16 import ch.qos.logback.core.util.OptionHelper;
17
18 public class LoggerModelHandler extends ModelHandlerBase {
19
20 Logger logger;
21 boolean inError = false;
22
23 public LoggerModelHandler(Context context) {
24 super(context);
25 }
26
27 static public ModelHandlerBase makeInstance(Context context, ModelInterpretationContext mic) {
28 return new LoggerModelHandler(context);
29 }
30
31 protected Class<LoggerModel> getSupportedModelClass() {
32 return LoggerModel.class;
33 }
34
35 @Override
36 public void handle(ModelInterpretationContext mic, Model model) throws ModelHandlerException {
37 inError = false;
38
39 LoggerModel loggerModel = (LoggerModel) model;
40
41 String finalLoggerName = mic.subst(loggerModel.getName());
42
43 LoggerContext loggerContext = (LoggerContext) this.context;
44
45 logger = loggerContext.getLogger(finalLoggerName);
46
47 String levelStr = mic.subst(loggerModel.getLevel());
48 if (!OptionHelper.isNullOrEmptyOrAllSpaces(levelStr)) {
49 if (JoranConstants.INHERITED.equalsIgnoreCase(levelStr) || NULL.equalsIgnoreCase(levelStr)) {
50 if(Logger.ROOT_LOGGER_NAME.equalsIgnoreCase(finalLoggerName)) {
51 addError(ErrorCodes.ROOT_LEVEL_CANNOT_BE_SET_TO_NULL);
52 } else {
53 addInfo("Setting level of logger [" + finalLoggerName + "] to null, i.e. INHERITED");
54 logger.setLevel(null);
55 }
56 } else {
57 Level level = Level.toLevel(levelStr);
58 addInfo("Setting level of logger [" + finalLoggerName + "] to " + level);
59 logger.setLevel(level);
60 }
61 }
62
63 String additivityStr = mic.subst(loggerModel.getAdditivity());
64 if (!OptionHelper.isNullOrEmptyOrAllSpaces(additivityStr)) {
65 boolean additive = OptionHelper.toBoolean(additivityStr, true);
66 addInfo("Setting additivity of logger [" + finalLoggerName + "] to " + additive);
67 logger.setAdditive(additive);
68 }
69
70 mic.pushObject(logger);
71 }
72
73 @Override
74 public void postHandle(ModelInterpretationContext mic, Model model) {
75 if (inError) {
76 return;
77 }
78 Object o = mic.peekObject();
79 if (o != logger) {
80 LoggerModel loggerModel = (LoggerModel) model;
81 addWarn("The object [" + o + "] on the top the of the stack is not the expected logger named "
82 + loggerModel.getName());
83 } else {
84 mic.popObject();
85 }
86
87 }
88
89 }