2016-06-07 2 views
1

У меня есть библиотека Java, поверх которой я имею легкие groovy-скрипты, которые работают как утилиты командной строки на терминале. Таким образом, вместо того, чтобы просить, чтобы мои пользователиНастроить logback из groovy-скрипта

java -cp ... com.foo.bar.package.SomeMainClass ... 

Они имеют доступ к «стандартным» POSIX-подобные утилиты:

footool -a <arg> -b <another> -vfg <positional_arg> 

Я хотел бы, что -v аргумент для контроля уровня ведения журнала для консоли Appender. Теперь, я в отличный шрифт. Groovy имеет самый отличный CLIbuilder, чтобы упростить анализ аргументов. Резервное копирование настраивается с использованием программных файлов. То, что я хочу сделать, должно быть легко. Правильно?

И все же, кажется, все, но невозможно проверить значение -v флага, и, соответственно, поставил перед Level за порог фильтра для к appender'у, который уже указанного в XML, или даже создать фильтр и Appender с нуля и добавить к регистратору.

Действительно? Похоже, что должен быть способом без написания 30 строк кода Java для Joran. Что мне нужно сделать, чтобы получить это (или что-то, что не 30 строк кода Java для Joran) для работы из моего groovy-скрипта?

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) 
+0

Установка уровня регистратора отключит уровней для всех приложений. Это не то, что моя Groovy/XML-конфигурация пытается сделать. Конфигурирование приложения с пороговым фильтром компактно и легко с использованием Groovy DSL. Кажется, это не компактный способ в Java. – dgorur

Смежные вопросы