Spring Bootのログ出力(How-toガイド)


Spring Bootのログ出力(How-toガイド)について以下の公式を読んだので訳した。
[72. Loggin ‘How-to’ guides](https://docs.spring.io/spring-boot/docs/current/reference/html/howto-logging.html)
なお、ログ出力(概要)は[Spring Bootのログ出力(概要)](
http://qiita.com/ARS_2000/items/7cf2f427d88dfd4f56a8)にまとめた。

# 72. ロギング設定

Spring Bootは必須となるロギングシステムへの依存は持っておらず(commons-loggingは除く)、多くのロギングシステムの中から実装を選択出来る。Logbackを利用する場合はそれを依存関係に含める必要がある。最も簡単な方法は全ての依存関係を持った「spring-boot-starter-logging」を追加することである。ただ、Webアプリケーションであれば「spring-boot-starter-web」を追加するだけで「spring-boot-starter-logging」が推移的依存で追加される。以下はMavenでの設定例。

```
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
</dependency>
```

Spring Bootはクラスパスに基づいてロギングを設定するための抽象的なロギングシステムを持っている。Logbackが有効ならばそれが最初に採用される。ロギングに関する設定がログレベルだけであるなら、application.propertiesにプレフィックス「logging.level」を利用して設定する。

```
logging.level.org.springframework.web=DEBUG
logging.level.org.hibernate=ERROR
```

また、コンソール出力に加えてファイル出力をする場合、logging.fileを利用して出力するファイルの場所を設定出来る。ログに関するより細かい設定をする場合、ロギングシステムでサポートされているネイティブの設定形式を使用する必要がある。Spring Bootはシステムのデフォルトの場所(例えばclasspath:logback.xml)からネイティブ設定を採用するが、logging.configプロパティを使用して設定ファイルの場所を設定することができる。

## 72.1. Logbackの設定

クラスパスのルートにlogback.xmlを配置すればそれが採用される(もしくはlogback-spring.xml)。
ログレベルを設定したければ、Spring Bootはinclude可能なデフォルト設定を提供している。

```
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
	<include resource="org/springframework/boot/logging/logback/base.xml"/>
	<logger name="org.springframework.web" level="DEBUG"/>
</configuration>
```

spring-boot jarの中にあるbase.xmlを見れば、ロギングシステムを構築する際に有用となるいくつかの便利なシステムプロパティが使われているのが分かる。例えば以下のようなプロパティ。

* ${PID} 現在のプロセスID
* ${LOG_FILE} logging.fileが設定されている場合
* ${LOG_PATH} logging.pathが設定されている場合(ログファイルのパス)
* ${LOG_EXCEPTION_CONVERSION_WORD} logging.exception-conversion-wordが設定されている場合

Spring Bootはログをコンソール出力する際にANSIのカラーターミナルも提供している(ログファイルへの出力には適用されない)。詳細はデフォルトのbase.xmlを参照してみてほしい。
Groovyがクラスパス上にあれば、logback.groovyでLogbackの設定が可能(それが存在すれば最優先で適用される)。

### 72.1.1. Logbackでファイルのみにログ出力をする設定

ログのコンソール出力をやめてファイルにのみ出力したい場合、(console-appender.xmlではなく)file-appender.xmlをインポートしたlogback-spring.xmlをカスタムする必要がある。以下は設定例。

```
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
	<include resource="org/springframework/boot/logging/logback/defaults.xml" />
	<property name="LOG_FILE" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}/}spring.log}"/>
	<include resource="org/springframework/boot/logging/logback/file-appender.xml" />
	<root level="INFO">
		<appender-ref ref="FILE" />
	</root>
</configuration>
```

加えて、application.propertiesにlogging.fileの設定の追加も必要。

```
logging.file=myapplication.log
```

## 72.2. Log4jの設定

Spring BootはLog4jもしくはLog4j 2もまたロギングシステムとしてサポートしているが、それらのうち1つだけがクラスパス上に設定出来る。Starter Pomを利用しているならば、Logbackへの依存を排除し代わりにLog4jとLog4jの任意のバージョンを指定する必要がある。Starter Pomを利用していないのであれば、commons-loggingに加えてLog4jとLog4jの任意のバージョンを指定する必要がある。以下のような設定が一番シンプルな設定になると思われる。

```
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter</artifactId>
	<exclusions>
		<exclusion>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-logging</artifactId>
		</exclusion>
	</exclusions>
</dependency>
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-log4j</artifactId>
</dependency>
```

Log4j 2を利用する場合、単にspring-boot-starter-log4jではなくspring-boot-starter-log4j2にするだけで良い。

### 72.2.1. Log4j 2の設定でYAMLもしくはJSONを利用する

Log4j 2の設定ファイルは、デフォルトのXML形式に加えてYAMLかJSON形式もサポートしている。YAMLかJSONを利用したければクラスパスに適切な依存関係を追加する必要があり、加えて、選択したファイル形式に合わせて設定ファイルに名前を付ける必要がある。


|フォーマット|依存関係|ファイル名|
|:--|:--|:--|
|YAML|com.fasterxml.jackson.core:jackson-databind<br />com.fasterxml.jackson.dataformat:jackson-dataformat-yaml|log4j2.yaml<br />log4j2.yml|
|JSON|com.fasterxml.jackson.core:jackson-databind|log4j2.json<br />log4j2.jsn|