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 }