2016-06-07 157 views
1

我有一個Java庫,最重要的是我有輕量級的groovy腳本作爲基於終端的命令行工具。因此,而不是問我的用戶從groovy腳本配置logback

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

他們有機會獲得一個「標準」 POSIX樣工具:

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

我想這-v參數來控制日誌記錄級別到控制檯的appender。現在,我 groovy腳本。 Groovy擁有最優秀的CLIbuilder,使參數解析變得簡單。 Logback使用groovy程序進行配置。我想做的事情應該很容易。對?

然而它似乎幾乎不可能檢查-v標誌的值,並相應設置Level對於一個已經在XML中指定,甚至從頭創建過濾器和附加器並添加一個appender閾值過濾器到記錄器。

真的嗎?似乎有必須是一種沒有爲Joran編寫30行Java代碼的方法。我需要做些什麼才能在我的groovy腳本中得到這個(或者不是Joran的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) 
+0

設置記錄器的級別將禁用所有appender的級別。這不是我的Groovy/XML配置所要做的。使用Groovy DSL配置帶有閾值過濾器的appender非常緊湊且易於使用。在Java中似乎不是一種緊湊的方式。 – dgorur