【问题标题】:Configure logback from groovy script从 groovy 脚本配置 logback
【发布时间】:2016-06-07 17:00:58
【问题描述】:

我有一个 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 标志的值似乎几乎不可能,并相应地设置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"
  }
}

【问题讨论】:

    标签: groovy logback logback-groovy


    【解决方案1】:

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

    【讨论】:

    • 设置记录器的级别将禁用所有附加程序的级别。这不是我的 Groovy/XML 配置想要做的。使用 Groovy DSL 配置带有阈值过滤器的 appender 既紧凑又容易。在 Java 中似乎不是一种紧凑的方式。
    猜你喜欢
    • 2023-03-09
    • 2015-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-24
    相关资源
    最近更新 更多