🌿

Spring Bootでアンダースコアを含む名前を持つロガーのログレベルを環境変数で設定する

2022/02/19に公開

課題

次のようにパッケージ名にアンダースコアを含むクラスで慣習的なロガーの作り方をすると、そのロガー名はcom.example.foo_bar.Bazになります。

package com.example.foo_bar;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

@Component
public class Baz {

    private static final Logger logger = LoggerFactory.getLogger(Baz.class);

    public void run() {
        logger.debug("Hello World");
    }
}

このロガーのログレベルを環境変数で設定する場合、次の名前では機能しませんでした。

  • LOGGING_LEVEL_COM_EXAMPLE_FOO_BAR_BAZ
  • LOGGING_LEVEL_COM_EXAMPLE_FOOBAR_BAZ

環境変数SPRING_APPLICATION_JSONで設定する

Spring Bootのリファレンスを読むと、環境変数(またはシステムプロパティ)SPRING_APPLICATION_JSONへJSON形式で設定を書けることがわかります。

https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.external-config

次のように環境変数SPRING_APPLICATION_JSONを設定することで、ログレベルを設定できました。

SPRING_APPLICATION_JSON='{"logging.level.com.example.foo_bar.Baz":"debug"}'

環境変数JAVA_TOOL_OPTIONS

他の方法として環境変数JAVA_TOOL_OPTIONSを使っても良いかもしれません。

JAVA_TOOL_OPTIONS="-Dlogging.level.com.example.foo_bar.Baz=debug"

おわりに

正直なところ、どちらの方法もやりたいことに対して複雑なため、もっと良い方法を知りたいです。

以上です。

追記

ばふぁさんがやり方を教えてくれた。

https://zenn.dev/bufferings/scraps/463c96c0a6ab78

Discussion