View Javadoc
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  }