Tue, Jan 17, 2017

Goslings開発メモ - その4: Spring Boot続続続編 (ロギング)

Goslings開発メモ - その4: Spring Boot続続続編 (ロギング)

Goslings開発メモ - その3: Spring Boot続続編 (例外処理)」の続き。

Spring Boot続続続編で、ロギングについて。


Spring Bootアプリにおけるロギング

Spring Bootアプリにおけるロギングについては公式のマニュアルHow-toガイドを読むべし。 この記事にはこれらの内容をまとめておく。


Spring Bootは内部でのロギングにApacheのCommons Loggingを使っている。

Commons Loggingはファサードライブラリだ。 つまり、Commons LoggingはロギングAPIだけをアプリケーションに提供し、実際のログ出力処理をするロギング実装ライブラリへの橋渡しとして機能する。 ロギング実装ライブラリには色々な選択肢があるが、Spring BootはJULLog4j 2Logback用のデフォルト設定を備えているので、これらのいずれかを使うのが楽であろう。

全てのスターターは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が備えているデフォルトのロギング設定は、ERRORWARNINFOレベルのログをいい感じにフォーマットしてコンソールに吐くというものになっている。

以下この設定の変更方法などを書く。

ファイルへのログ出力

ログをファイルにも吐くようにするには、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でローテーションする。

ログレベル

ログレベルには重大度の低い方からTRACEDEBUGINFOWARNERRORFATALの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.xmllogback.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.xmlfile-appender.xmlだ。 これらはSpring Bootのコアライブラリであるspring-boot.jarに含まれるファイル。 spring-boot.jarには他にもbase.xmlconsole-appender.xmlが含まれている。 これらは、前節までに書いたSpring Bootのロギング挙動を実現している設定ファイルなので、これらをincludeして利用すれば自分のカスタム設定ファイルが簡単に書ける。

もう一点はLOG_FILEといったプロパティ。 これらはSpring Bootが設定してくれるプロパティで、詳細はここに。


今日はここまで。 次回もまたSpring Bootで、静的リソース処理について。