0時半に寝て6時半に起きた。だいぶ開発に集中してきて朝も起きれるようになってきた。

log4j2.yml を読み込む

log4j2 のログ設定を整理していて設定ファイルを読み込む順番は次のようにドキュメントに記載されている。java ライブラリのこういった手厚いルールはややうんざりするところもあるけど、是非はともかく、ファイルフォーマットの違い、ファイル名の違いで読み込む優先順位がある。歴史のあるライブラリだから要求を聞いているうちにこんな感じになったんだろうと推測する。

  1. Log4j will inspect the “log4j2.configurationFile” system property and, if set, will attempt to load the configuration using the ConfigurationFactory that matches the file extension. Note that this is not restricted to a location on the local file system and may contain a URL.
  2. If no system property is set the properties ConfigurationFactory will look for log4j2-test.properties in the classpath.
  3. If no such file is found the YAML ConfigurationFactory will look for log4j2-test.yaml or log4j2-test.yml in the classpath.
  4. If no such file is found the JSON ConfigurationFactory will look for log4j2-test.json or log4j2-test.jsn in the classpath.
  5. If no such file is found the XML ConfigurationFactory will look for log4j2-test.xml in the classpath.
  6. If a test file cannot be located the properties ConfigurationFactory will look for log4j2.properties on the classpath.
  7. If a properties file cannot be located the YAML ConfigurationFactory will look for log4j2.yaml or log4j2.yml on the classpath.
  8. If a YAML file cannot be located the JSON ConfigurationFactory will look for log4j2.json or log4j2.jsn on the classpath.
  9. If a JSON file cannot be located the XML ConfigurationFactory will try to locate log4j2.xml on the classpath.
  10. If no configuration file could be located the DefaultConfiguration will be used. This will cause logging output to go to the console.

log4j2 Automatic Configuration

普通 java は xml で設定を書くけど、この設定ファイルの読み込みルールをみたら yml にも対応しているならその方がよさそうとか思うやん。log4j2.xml から log4j2.yml に書き換えて試してみると、ログ設定が有効にならない。どうも log4j2.yml を読み込んでいないようにみえる。ググっていると jackson-dataformat-yaml を依存関係に追加しろといった内容をみつかるけど、どういう理屈でそういう仕様になっているのか、まったく理解できない。なによりも読み飛ばしたというログが出力されないから設定ファイルを読んでいるのかどうかすら気付けない。これは知ってないとはまるポイントの1つ。

<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-yaml</artifactId>
</dependency>