#navi_header|Groovy| slf4j + logbackをGroovyで使うメモ。 * logbackのサイト 公式ドキュメント重要。 - Chapter 3: Configuration -- http://logback.qos.ch/manual/configuration.html --- logback.groovy, logback.xmlなど、設定ファイルの参照先や参照順序が載ってます。 - Chapter 6: Layouts -- http://logback.qos.ch/manual/layouts.html --- ログ出力のフォーマットを設定する方法の詳細、大変お世話になりそうなPatternLayoutのリファレンス。 - Chapter12: Groovy configuration -- http://logback.qos.ch/manual/groovy.html --- logback.groovyの説明。 * スクリプトから使う - "log"を導入したいクラスに"@Slf4j"アノテーションを付けておきます。 - "@Grab"でslf4j-apiとlogback-classicを指定すると動いてくれました。特に設定ファイルがない場合はDEBUGレベル以上でコンソールに出力。 slf4j1.groovy: #pre||> @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() ||< 実行結果: #pre||> $ 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を使う logback.groovyをclasspathのパッケージ無しで参照できるようにしておきます。 mavenとかgradle使ってるなら、"src/main/resources/"とかの直下に置いておけば、パッケージングとか実行されるときにclasspathのパッケージ無しで指定できるようにしてくれるはずです。 スクリプト実行するなら、実行するスクリプトと同じ場所に置いておけば多分大丈夫。 シンプルなlogback.groovy: #pre||> 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"を追加します。 #pre||> @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がちゃんとロードされてます)。 #pre||> $ 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 ||< * GroovyServとの組み合わせでの注意点 - logback.groovyを使うには、スクリプト側でsystem class loaderとしてgrabを動かす必要がある = logback.groovyもsystem class loader経由で読み込まれる影響か、一度読み込まれてしまうと、groovyserver側のインスタンスにキャッシュされる影響か(よくわからないけど)、logback.groovyを変更して再実行しても変更が反映されず、最初に読み込まれた時の設定のままになってしまう。 -- work arround : groovyserver -r でgroovyserver側のJVMを再起動します。 * その他の参考情報 - logback.groovyで設定記述しようとしたらアレな事になった件について - 設計と実装の狭間で。 -- http://d.hatena.ne.jp/taichitaichi/20120403/1333465893 --- logback-classic-1.0.1 で発生していた不具合とwork arroundについて。 - how to use logback configured via logback.groovy with groovy - Stack Overflow -- http://stackoverflow.com/questions/13867057/how-to-use-logback-configured-via-logback-groovy-with-groovy - logbackで設定を記述する時の注意事項等。続き。 - 設計と実装の狭間で。 -- http://d.hatena.ne.jp/taichitaichi/20090213/1234517932 --- JavaとXMLでの設定例。バージョンがやや古め。 - Logbackで設定ファイルを切り替える #Java #logback #log - Qiita -- http://qiita.com/items/a62783b0e31a66d33303 --- Javaのレイヤーで、logbackの設定ファイルの動的な切り替えの例。logback.groovyでも応用できるかな? #navi_footer|Groovy|