slf4j + logbackをGroovyで使うメモ。
公式ドキュメント重要。
slf4j1.groovy:
@Grapes([ @Grab(group='org.slf4j', module='slf4j-api', version='1.7.2'), @Grab(group='ch.qos.logback', module='logback-classic', version='1.0.9'), ]) import groovy.util.logging.* @Slf4j class C1 { static void m1() { println 'from m1:' log.trace 'trace2' log.debug 'debug1' log.info 'info1' log.warn 'warn1' log.error 'error1' } } @Slf4j class C2 { static void m2() { println 'from m2:' log.trace 'trace2' log.debug 'debug2' log.info 'info2' log.warn 'warn2' log.error 'error2' } } C1.m1() C2.m2()
実行結果:
$ groovy slf4j1.groovy from m1: 22:41:04.295 [main] DEBUG C1 - debug1 22:41:04.299 [main] INFO C1 - info1 22:41:04.301 [main] WARN C1 - warn1 22:41:04.301 [main] ERROR C1 - error1 from m2: 22:41:04.408 [main] DEBUG C2 - debug2 22:41:04.408 [main] INFO C2 - info2 22:41:04.408 [main] WARN C2 - warn2 22:41:04.408 [main] ERROR C2 - error2
logback.groovyをclasspathのパッケージ無しで参照できるようにしておきます。
mavenとかgradle使ってるなら、"src/main/resources/"とかの直下に置いておけば、パッケージングとか実行されるときにclasspathのパッケージ無しで指定できるようにしてくれるはずです。
スクリプト実行するなら、実行するスクリプトと同じ場所に置いておけば多分大丈夫。
シンプルなlogback.groovy:
import ch.qos.logback.classic.encoder.PatternLayoutEncoder import ch.qos.logback.core.ConsoleAppender import static ch.qos.logback.classic.Level.* appender('CONSOLE', ConsoleAppender) { encoder(PatternLayoutEncoder) { pattern = "%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n" } } root(TRACE, ['CONSOLE'])
これと上で紹介したslf4j1.groovyを実行する場合は、system class loaderとしてgrabを動かす必要があります。ということで、slf4j1.groovyの"@Grab"の前に以下の様な"@GrabConfig"を追加します。
@GrabConfig(systemClassLoader=true) @Grapes([ @Grab(group='org.slf4j', module='slf4j-api', version='1.7.2'), @Grab(group='ch.qos.logback', module='logback-classic', version='1.0.9'), ]) import groovy.util.logging.* ...
slf4j1.groovyを実行してみると、TRACEレベルが有効になり、日付が入るようになりました(=用意したlogback.groovyがちゃんとロードされてます)。
$ groovy slf4j1.groovy from m1: 2013-03-09 22:44:09.107 [main] TRACE C1 - trace2 2013-03-09 22:44:09.113 [main] DEBUG C1 - debug1 2013-03-09 22:44:09.114 [main] INFO C1 - info1 2013-03-09 22:44:09.115 [main] WARN C1 - warn1 2013-03-09 22:44:09.116 [main] ERROR C1 - error1 from m2: 2013-03-09 22:44:09.260 [main] TRACE C2 - trace2 2013-03-09 22:44:09.260 [main] DEBUG C2 - debug2 2013-03-09 22:44:09.260 [main] INFO C2 - info2 2013-03-09 22:44:09.260 [main] WARN C2 - warn2 2013-03-09 22:44:09.260 [main] ERROR C2 - error2