Table of Contents
「Goslings開発メモ - その3: Spring Boot続続編 (例外処理)」の続き。
Spring Boot続続続編で、ロギングについて。
Spring Bootアプリにおけるロギング
Spring Bootアプリにおけるロギングについては公式のマニュアルとHow-toガイドを読むべし。 この記事にはこれらの内容をまとめておく。
Spring Bootは内部でのロギングにApacheのCommons Loggingを使っている。
Commons Loggingはファサードライブラリだ。 つまり、Commons LoggingはロギングAPIだけをアプリケーションに提供し、実際のログ出力処理をするロギング実装ライブラリへの橋渡しとして機能する。 ロギング実装ライブラリには色々な選択肢があるが、Spring BootはJUL、 Log4j 2、Logback用のデフォルト設定を備えているので、これらのいずれかを使うのが楽であろう。
全てのスターターはspring-boot-starter-logging
というロギングスターターに依存していて、これがLogbackを使うので、普通はそのままLogbackを使うことになる。
spring-boot-starter-logging
は、JUL、Commons Logging、Log4j、SLF4Jによるログ出力をLogbackにルーティングするため、アプリ側や他の依存ライブラリがこれらを使っていてもLogbackに一本化できる。
spring-boot-starter-logging
の代わりにspring-boot-starter-log4j2
に依存し、Log4j 2を使う方法もあるが、Goslingsには普通にspring-boot-starter-logging
を使った。
また、Goslings本体のログ出力には、プレースホルダを使いたかったのでSLF4Jを使った。
Spring Bootアプリにおけるロギング設定
Spring Bootが備えているデフォルトのロギング設定は、ERROR
、WARN
、INFO
レベルのログをいい感じにフォーマットしてコンソールに吐くというものになっている。
以下この設定の変更方法などを書く。
ファイルへのログ出力
ログをファイルにも吐くようにするには、logging.file
というプロパティでファイルパスを指定するか、logging.path
というプロパティでディレクトリパスを指定すればいい。
(後者の場合ログファイル名はspring.log
になる。)
Spring Bootアプリでプロパティを指定する方法は色々あり(こことかここ参照)、大抵はapplication.properties
で指定するんだろうけど、手軽にコマンドラインで以下の様に指定することもできる。
java -jar build/libs/goslings-0.0.1.jar --logging.file=build/hoge.log
ログファイルはデフォルトで10MBでローテーションする。
ログレベル
ログレベルには重大度の低い方からTRACE
、DEBUG
、INFO
、WARN
、ERROR
、FATAL
の6段階があり、指定したログレベル以上のログが出力される。(OFF
というログ出力を止めるものもある。)
つまりSpring BootのデフォルトのログレベルはINFO
だということだ。(LogbackにはFATAL
がなくERROR
として出力される。)
ログレベルはlogging.level.<ロガー名>
という形式のプロパティで指定できる。
例えばコマンドラインから指定するなら以下の感じ。
java -jar build/libs/goslings-0.0.1.jar --logging.level.org.springframework.web=DEBUG
全ロガーのログレベルはlogging.level.root
で指定できる。
ロギング実装ライブラリの設定
ロギング実装ライブラリの設定ファイルをカスタマイズして、より詳細な設定をすることもできる。
Logbackの場合、クラスパスのルートに置かれたlogback-spring.xml
かlogback.xml
がロードされる。
設定ファイルの二重初期化を防いだりSpring Boot拡張設定を利用可能にするために、前者のファイル名が推奨されている。
(Groovyが使える環境ならlogback-spring.groovy
でもいい。)
いつものようにjavaコマンドでアプリを起動する場合は-jar
オプションを使うため、-cp
オプションでクラスパスを指定しても無視されてしまうので、基本はlogback-spring.xml
はjarの中に入れることになる。
プロジェクトのリソースディレクトリのトップ(デフォルトではsrc/main/resources/
)にlogback-spring.xml
を置いておけば、GradleのJavaプラグインのprocessResources
タスクによってjar内の適切な場所に取り込まれる。
logging.config
プロパティで設定ファイルのパスを指定することもできる。
例えばコマンドラインから指定するなら以下の感じ。
java -jar build/libs/goslings-0.0.1.jar --logging.config=logback-spring.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>
ここで注目すべきは2点。
まずはinclude
しているdefaults.xml
とfile-appender.xml
だ。
これらはSpring Bootのコアライブラリであるspring-boot.jar
に含まれるファイル。
spring-boot.jar
には他にもbase.xml
とconsole-appender.xml
が含まれている。
これらは、前節までに書いたSpring Bootのロギング挙動を実現している設定ファイルなので、これらをinclude
して利用すれば自分のカスタム設定ファイルが簡単に書ける。
もう一点はLOG_FILE
といったプロパティ。
これらはSpring Bootが設定してくれるプロパティで、詳細はここに。
今日はここまで。 次回もまたSpring Bootで、静的リソース処理について。