Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
48
Help us understand the problem. What is going on with this article?
@NagaokaKenichi

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

More than 5 years have passed since last update.

Spring Bootのログ出力(How-toガイド)について以下の公式を読んだので訳した。
72. Loggin ‘How-to’ guides
なお、ログ出力(概要)はSpring Bootのログ出力(概要)にまとめた。

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
com.fasterxml.jackson.dataformat:jackson-dataformat-yaml
log4j2.yaml
log4j2.yml
JSON com.fasterxml.jackson.core:jackson-databind log4j2.json
log4j2.jsn
48
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
48
Help us understand the problem. What is going on with this article?