Настроить выход из скрипта 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)
Другие вопросы по тегам