2

Java ライブラリがあり、その上に、端末ベースのコマンドライン ユーティリティとして機能する軽量の groovy スクリプトがあります。ユーザーにそうするように頼むのではなく

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

「標準」POSIX ライクなユーティリティにアクセスできます。

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

-vコンソールアペンダーへのログレベルを制御する引数が欲しいです。今、私はグルーヴィーなスクリプトにいます。Groovy には、引数の解析を容易にする最も優れた CLIbuilder があります。Logback は、groovy プログラムを使用して構成されます。私がやりたいことは簡単なはずです。右?

-vそれでも、フラグの値をチェックして、それに応じLevelて XML で既に指定されているアペンダーのしきい値フィルターを設定したり、フィルターとアペンダーを最初から作成してロガーに追加したりすることはほとんど不可能に思えます。

本当に?Joran用に 30 行の Java コードを書かない方法があるに違いないようです。これ (または Joran 用の 30 行の Java コードではないもの) を私の 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"
  }
}
4

1 に答える 1

2

logback.groovy魔法を使わずに、プログラムによる 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)
于 2016-08-19T13:23:03.550 に答える