package dmg.util.logback; import ch.qos.logback.classic.Level; import ch.qos.logback.classic.Logger; import ch.qos.logback.classic.LoggerContext; import org.slf4j.LoggerFactory; import java.util.Collection; import java.util.Formatter; import org.dcache.util.Args; import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkNotNull; /** * Provides basic cell shell commands to inspect and manipulate log * filter thresholds. */ public class FilterShell { private final FilterThresholdSet _thresholds; private final LoggerContext _context = (LoggerContext) LoggerFactory.getILoggerFactory(); public FilterShell(FilterThresholdSet thresholds) { checkNotNull(thresholds); _thresholds = thresholds; } private boolean isExistingLogger(LoggerName name) { for (Logger logger: getLoggers()) { if (name.isNameOfLogger(logger)) { return true; } } return false; } private Collection<Logger> getLoggers() { return _context.getLoggerList(); } public static final String hh_log_ls = "[-a] [<appender>] [<logger>]"; public static final String fh_log_ls = "Lists current log thresholds. Inherited thresholds are marked\n" + "with an asterix."; public String ac_log_ls_$_0_2(Args args) { boolean all = args.hasOption("a"); String appender = args.argv(0); String logger = args.argv(1); Formatter out = new Formatter(); if (logger != null) { lsLogger(out, all, LoggerName.getInstance(logger), appender); } else if (appender != null) { lsAppender(out, all, appender); } else { ls(out, all); } return out.toString(); } private void ls(Formatter out, boolean all) { for (String appender: _thresholds.getAppenders()) { lsAppender(out, all, appender); } } private void lsAppender(Formatter out, boolean all, String appender) { out.format("%s:\n", appender); for (Logger logger: getLoggers()) { lsLogger(out, all, LoggerName.getInstance(logger), appender); } } private void lsLogger(Formatter out, boolean all, LoggerName logger, String appender) { Level level = _thresholds.get(logger, appender); if (level != null) { out.format(" %s=%s\n", logger, level); } else { level = _thresholds.getInheritedMap(logger).get(appender); if (level != null) { out.format(" %s=%s*\n", logger, level); } else if (all) { out.format(" %s\n", logger); } } } public static final String hh_log_set = "<appender> [<logger>] OFF|ERROR|WARN|INFO|DEBUG|TRACE|ALL"; public static final String fh_log_set = "Sets the log level of <appender>."; public String ac_log_set_$_2_3(Args args) { String appender = args.argv(0); LoggerName logger; String threshold; if (args.argc() == 3) { logger = LoggerName.getInstance(args.argv(1)); threshold = args.argv(2); } else { logger = LoggerName.ROOT; threshold = args.argv(1); } checkArgument(_thresholds.hasAppender(appender), "Appender not found"); checkArgument(isExistingLogger(logger), "Logger not found"); checkArgument(Level.toLevel(threshold, null) != null, "Invalid log level: " + threshold); _thresholds.setThreshold(logger, appender, Level.valueOf(threshold)); return ""; } public static final String hh_log_reset = "[-a] <appender> [<logger>]"; public static final String fh_log_reset = "Resets the log level of <appender>. The log level for <appender>\n" + "will be inherited from the parent cell."; public String ac_log_reset_$_1_2(Args args) { String appender = args.argv(0); if (args.argc() == 2) { _thresholds.remove(LoggerName.getInstance(args.argv(1)), appender); } else if (!args.hasOption("a")) { _thresholds.remove(LoggerName.ROOT, appender); } else { for (Logger logger: getLoggers()) { _thresholds.remove(LoggerName.getInstance(logger), appender); } } return ""; } }