package grails.plugin.lightweightdeploy.logging; import ch.qos.logback.classic.Level; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.TimeZone; import static java.util.Collections.unmodifiableList; public class LoggingConfiguration { private static final Logger logger = LoggerFactory.getLogger(LoggingConfiguration.class); private List<AbstractLoggingConfiguration> appenderConfigurations = new ArrayList<AbstractLoggingConfiguration>(); private Level rootLevel = Level.INFO; private Map<String, Level> loggers = new HashMap<String, Level>(); public LoggingConfiguration(Map<String, ?> config) { if (config.containsKey("level")) { rootLevel = Level.toLevel(config.get("level").toString()); } if (config.containsKey("appenders")) { List<Map<String, ?>> appendersConfig = (List<Map<String, ?>>) config.get("appenders"); for (Map<String, ?> appenderConfig : appendersConfig) { appenderConfigurations.add(createAppenderConfiguration(appenderConfig)); } } if (config.containsKey("loggers")) { for (Map.Entry<String, ?> entry : ((Map<String, ?>) config.get("loggers")).entrySet()) { loggers.put(entry.getKey(), Level.toLevel(entry.getValue().toString())); } } // handle deprecated logging format if (config.containsKey("file")) { logger.warn("'file' is deprecated - please move to 'appenders' list with type 'file'"); Map<String, ?> fileConfig = (Map<String, ?>) config.get("file"); appenderConfigurations.add(new FileLoggingConfiguration(fileConfig)); } if (config.containsKey("console")) { logger.warn("'console' is deprecated - please move to 'appenders' list with type 'console'"); Map<String, ?> consoleConfig = (Map<String, ?>) config.get("console"); appenderConfigurations.add(new ConsoleLoggingConfiguration(consoleConfig)); } if (config.containsKey("rootLevel")) { logger.warn("'rootLevel' is deprecated in favor of 'level'"); rootLevel = Level.toLevel(config.get("rootLevel").toString()); } } public List<AbstractLoggingConfiguration> getAppenderConfigurations() { return unmodifiableList(appenderConfigurations); } static AbstractLoggingConfiguration createAppenderConfiguration(Map<String, ?> appenderConfig) { String type = appenderConfig.get("type").toString(); if (type.equals("file")) { return new FileLoggingConfiguration(appenderConfig); } else if (type.equals("console")) { return new ConsoleLoggingConfiguration(appenderConfig); } else if (type.equals("filtered")) { return new FilteredLoggingConfiguration(appenderConfig); } else { throw new IllegalArgumentException("Unknown appender type '" + type + "'"); } } public Level getRootLevel() { return rootLevel; } public Map<String, Level> getLoggers() { return loggers; } public TimeZone getTimeZone() { if (!appenderConfigurations.isEmpty()) { return appenderConfigurations.get(0).getTimeZone(); } return TimeZone.getDefault(); } }