从groovy脚本配置logback



我有一个Java库,上面有轻量级的groovy脚本,可以作为基于终端的命令行实用程序。因此,与其要求我的用户使用

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

他们可以访问类似POSIX的"标准"实用程序:

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

我希望-v参数控制控制台附加程序的日志记录级别。现在,我正在一个groovy脚本中。Groovy拥有最优秀的CLIbuilder,可以简化参数解析。Logback是使用groovy程序配置的。我想做的应该很容易。正确的

然而,检查-v标志的值,并相应地为XML中已经指定的appender设置阈值过滤器的Level,甚至从头开始创建过滤器和appender并添加到记录器中,似乎几乎是不可能的。

真的吗?似乎必须有一种方法不需要为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"
}
}

您可以简单地使用编程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)

最新更新