Groovyでログを出す方法まとめ

# XML設定ファイルを使う方法
設定ファイルの配置先は次の通り

* 単なるスクリプトの設定は次のいずれか
  * クラスパス通っている場所
  * カレントディレクトリ
* Gradleでビルドする場合 src/main/resources/logback.xml

参考：hishidamaさんのslf4jメモ http://www.ne.jp/asahi/hishidama/home/tech/java/slf4j.html

```xml:logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>
    </encoder>
  </appender>

  <root level="INFO">
    <appender-ref ref="STDOUT" />
  </root>
</configuration>
```

```groovy:log_xml.groovy
@Grab("org.slf4j:slf4j-api:1.7.21")
@Grab("ch.qos.logback:logback-classic:1.1.7")

import org.slf4j.Logger
import org.slf4j.LoggerFactory

def log = LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME)

log.error "error log"
log.warn "warn log"
log.info "info log"
log.debug "debug log"
log.trace "trace log"
```

この例ではXMLファイルでINFOレベルに設定している。

```shell-session:output
2016-12-01 02:13:08.186 [main] ERROR ROOT - error log
2016-12-01 02:13:08.188 [main] WARN  ROOT - warn log
2016-12-01 02:13:08.189 [main] INFO  ROOT - info log
```

# XML設定ファイルを省略する方法

## デフォルトだとDEBUGレベルになる

```groovy:log_no_xml.groovy
@Grab("org.slf4j:slf4j-api:1.7.21")
@Grab("ch.qos.logback:logback-classic:1.1.7")

import org.slf4j.Logger
import org.slf4j.LoggerFactory

def log = LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME)

log.error "error log"
log.warn "warn log"
log.info "info log"
log.debug "debug log"
log.trace "trace log"
```

```shell-session:output
02:16:10.956 [main] ERROR ROOT - error log
02:16:10.962 [main] WARN ROOT - warn log
02:16:10.962 [main] INFO ROOT - info log
02:16:10.962 [main] DEBUG ROOT - debug log
```

## ログレベルを変更する方法
スクリプトならこれがおすすめ。

参考：<a href="http://qiita.com/sunnyone/items/78895edb00058b7f78f1">XMLを書かずにGroovyからLogbackのログ出力をINFOレベル以上に限定する</a>

```groovy:log_no_xml.groovy
@Grab("org.slf4j:slf4j-api:1.7.21")
@Grab("ch.qos.logback:logback-classic:1.1.7")

import org.slf4j.Logger
import org.slf4j.LoggerFactory
import ch.qos.logback.classic.Level

LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME).level = Level.INFO

def log = LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME)

log.error "error log"
log.warn "warn log"
log.info "info log"
log.debug "debug log"
log.trace "trace log"
```

```shell-session:output
02:16:10.956 [main] ERROR ROOT - error log
02:16:10.962 [main] WARN ROOT - warn log
02:16:10.962 [main] INFO ROOT - info log
02:16:10.962 [main] DEBUG ROOT - debug log
```

# アノテーション使う方法
クラスに対して付ける

参考：http://www.canoo.com/blog/2010/09/20/log-groovys-new-and-extensible-logging-conveniences/
　　　http://aoking.hatenablog.jp/entry/2013/07/31/122305

```groovy:log_annotation.groovy
@Grab("org.slf4j:slf4j-api:1.7.21")
@Grab("ch.qos.logback:logback-classic:1.1.3")

import groovy.util.logging.Slf4j

@Slf4j
class PrintLog {
  def display() {
    log.error "error log"
    log.warn "warn log"
    log.info "info log"
    log.debug "debug log"
    log.trace "trace log"
  }
}

def printLog = new PrintLog()
printLog.display()
```

```shell-session:output
10:26:40.126 [main] ERROR PrintLog - error log
10:26:40.136 [main] WARN  PrintLog - warn log
10:26:40.137 [main] INFO  PrintLog - info log
10:26:40.138 [main] DEBUG PrintLog - debug log
```

## ログレベル変更(その1)
ファイル毎にログレベルを設定したい場合。

```groovy:log_level_annotation.groovy
@Grab("org.slf4j:slf4j-api:1.7.21")
@Grab("ch.qos.logback:logback-classic:1.1.3")

import org.slf4j.Logger
import org.slf4j.LoggerFactory
import groovy.util.logging.Slf4j
import ch.qos.logback.classic.Level

@Slf4j
class PrintLog {

  def display() {
    log.error "error log"
    log.warn "warn log"
    log.info "info log"
    log.debug "debug log"
    log.trace "trace log"
  }
}

LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME).level = Level.INFO

def printLog = new PrintLog()
printLog.display()
```

```shell-session:output
10:35:17.365 [main] ERROR PrintLog - error log
10:35:17.368 [main] WARN  PrintLog - warn log
10:35:17.368 [main] INFO  PrintLog - info log
```

## ログレベル変更(その2)
メソッド毎にログレベルを設定したい場合(実際にはなさそう)

```groovy:log_level_annotation.groovy
@Grab("org.slf4j:slf4j-api:1.7.21")
@Grab("ch.qos.logback:logback-classic:1.1.3")

import groovy.util.logging.Slf4j
import ch.qos.logback.classic.Level

@Slf4j
class PrintLog {

  def display() {
    log.level = Level.INFO

    log.error "error log"
    log.warn "warn log"
    log.info "info log"
    log.debug "debug log"
    log.trace "trace log"
  }
}

def printLog = new PrintLog()
printLog.display()
```

```shell-session:output
10:32:09.722 [main] ERROR PrintLog - error log
10:32:09.728 [main] WARN  PrintLog - warn log
10:32:09.728 [main] INFO  PrintLog - info log
```