LoginSignup
2
4

More than 3 years have passed since last update.

SpringBootのログ設定でapplication.ymlだけでやろうとして一部うまくいかなかった話

Last updated at Posted at 2019-12-20

概要

小ネタですが、SpringBootで、YAML形式の設定ファイルでうまくいかなかった話を書きます。

対象読者

  • 同じようなことをして同じ目にあった人
  • 2019年の時点で、SpringBoot 2.2.1などで開発している人

SpringBootにおけるログ設定

背景

SpringBootでは、スムースにアプリケーションを開発できるよう、様々な工夫がなされています。ログの設定においても、Javaの標準的なログインターフェースを上手に使えるような設定が、何もしなくても使えるように)準備されています。

2019年12月で、できることとできないこと

2019年12月時点の話です。この記事を読んだときに改善されていたらすみません。

筆者は、YAML形式でアプリケーションの設定ファイル(application.yml)を書くのが見やすくて好きなのですが、ログの設定に関して、エントリ執筆時点のバージョンではうまくいかない書き方がありました。

SpringBootでは、アプリケーションの設定ファイル(application.yml)に、ログに関する設定を書くことができ、外部のログライブラリのXMLファイルがなくても、ある程度コントロールすることができます。
これを用いると、通常であればlogbackやlog4jのXMLファイルを別に作成し指定しなければいけない内容について、ある程度、書かずに済む範囲があります。

例えば、アプリケーションのログレベルを決めるとき、下図のような書き方ができます。

logging:
  level:
    root: DEBUG

このとき、slf4jを使って出力したログに関する制御ができ、ログレベルがDEBUGのものについて、標準出力に表示されるようになります。

SpringBootでは、ログの出力先について、標準出力以外にも、ログファイルを指定することができます。下図では、「calc.log」というファイル名を指定しています。

logging:
  level:
    root: DEBUG
    org.springframework: DEBUG
  file: "calc.log"

ファイル名が指定できると、次にはファイルに関するあれこれも指定したくなります。

が、こうは書けません。(下図は動かない例。上記に加え、file:の行の後に、ファイルに関する設定を書きたいつもり。が、YAMLのフォーマットとして正しくない)

logging:
  level:
    root: DEBUG
    org.springframework: DEBUG
  file: "calc.log"
    max-size: 1000000
[main] ERROR com.hrkt.commandlinecalculator.CommandlineCalculatorApplication - Failed to load property source from location 'classpath:/application.yml'
java.lang.IllegalStateException: Failed to load property source from location 'classpath:/application.yml'
(中略)

        at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:52)
Caused by: org.yaml.snakeyaml.parser.ParserException: while parsing a block mapping
 in 'reader', line 13, column 3:
      level:
      ^
expected <block end>, but found '<block mapping start>'
 in 'reader', line 17, column 5:
        max-size: 1000000
        ^

        at org.yaml.snakeyaml.parser.ParserImpl$ParseBlockMappingKey.produce(ParserImpl.java:572)


同じようなことを考えた人が、SpringBootのIssueのところでも話をしていますが、現時点ではできない感じです。

仕方がないので、筆者は下記のように、ファイル名のところだけ別の行にして、このエラーを回避することにしました(下図)。

logging.file: "calc.log"
logging:
  level:
    root: DEBUG
    org.springframework: DEBUG
  file:
    max-size: 1000000

おわりに

SpringBootのお便利機能のうちのログ設定部分で、筆者がYAML形式を使ってうまくいかなかった例を紹介しました。

参考までに、SpringBootの起動時のバナー表示などを抑える設定と合わせて入れると、application.ymlは下図のような形になります。

spring:
  main:
    banner-mode: "off"
    log-startup-info: true

# logging. line is separated to 2 blocks because..
# https://github.com/spring-projects/spring-boot/issues/12510:
# https://github.com/spring-projects/spring-boot/issues/12596:

logging.file: "calc.log"
logging:
  level:
    root: DEBUG
    org.springframework: DEBUG
  file: "calc.log"
    max-size: 1000000
2
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
4