Настроить выход из скрипта groovy
У меня есть библиотека Java, поверх которой у меня есть легкие скрипты Groovy, которые функционируют как утилиты командной строки на основе терминала. Поэтому вместо того, чтобы просить моих пользователей
java -cp ... com.foo.bar.package.SomeMainClass ...
У них есть доступ к "стандартной" POSIX-подобной утилите:
footool -a <arg> -b <another> -vfg <positional_arg>
Я бы этого хотел -v
аргумент для управления уровнем ведения журнала для консольного приложения. Теперь я в отличном сценарии. Groovy имеет самый превосходный CLIbuilder для облегчения анализа аргументов. Logback настраивается с помощью заводных программ. То, что я хочу сделать, должно быть легко. Правильно?
И все же, кажется, почти невозможно проверить ценность -v
флаг и, соответственно, установить Level
для порогового фильтра для appender, который уже указан в XML, или даже для создания фильтра и appender с нуля и добавления в регистратор.
В самом деле? Похоже, должен быть способ без написания 30 строк Java-кода для Джорана. Что мне нужно сделать, чтобы заставить это (или что-то, что не является 30 строками Java-кода для Джорана) работать из моего отличного скрипта?
def cliBuilder = new CliBuilder...
def options = cli.parse(args)
def logLevel = options.v ? Level.DEBUG : Level.INFO
appender("CONSOLE", ConsoleAppender) {
filter(ThresholdFilter) {
level = logLevel
}
encoder(PatternLayoutEncoder) {
pattern = "%-4relative [%thread] %-5level %logger{30} - %msg%n"
}
}
1 ответ
Вы можете просто использовать программную конфигурацию Groovy без logback.groovy
магия:
import ch.qos.logback.classic.Logger
import static org.slf4j.LoggerFactory.getLogger
import static org.slf4j.Logger.ROOT_LOGGER_NAME as ROOT
import static ch.qos.logback.classic.Level.WARN
((Logger) getLogger(ROOT)).setLevel(WARN)
// one-liner
((ch.qos.logback.classic.Logger) org.slf4j.LoggerFactory.getLogger(ch.qos.logback.classic.Logger.ROOT_LOGGER_NAME)).setLevel(ch.qos.logback.classic.Level.WARN)
это также полезно для перенаправления регистрации в stderr
:
import ch.qos.logback.classic.Logger
import ch.qos.logback.core.ConsoleAppender as Console
import static org.slf4j.LoggerFactory.getLogger
import static org.slf4j.Logger.ROOT_LOGGER_NAME as ROOT
import static ch.qos.logback.classic.Level.WARN
((Console) ((Logger) getLogger(ROOT)).getAppender("console")).setOutputStream(System.err)
// one-liner
((ch.qos.logback.core.ConsoleAppender) ((ch.qos.logback.classic.Logger) org.slf4j.LoggerFactory.getLogger(ch.qos.logback.classic.Logger.ROOT_LOGGER_NAME)).getAppender("console")).setOutputStream(System.err)