テスト時のSpring Bootでのログレベルの設定

1. 概要

このチュートリアルでは、* Spring Bootアプリケーションのテストを実行するときにログレベルを設定する方法を示します*。
テストに合格している間はほとんどログを無視できますが、*失敗したテストを診断*する必要がある場合は、適切なログレベルを選択することが重要です。

2. ログレベルの重要性

ログレベルを正しく構成すると、時間を大幅に節約できます。
たとえば、CIサーバーでテストが失敗しても開発マシンを通過する場合、*十分なログ出力がない限り、失敗したテストを診断することはできません*。 一方、詳細を記録しすぎると、有用な情報を見つけるのが難しくなる可能性があります。
適切な量​​の詳細を達成するために、アプリケーションのパッケージのログレベルを微調整できます。 Javaパッケージがテストにとってより重要であることがわかった場合は、_DEBUG_などのより低いレベルを指定できます。 同様に、ログに過度のノイズが入らないようにするために、重要度の低いパッケージに対して、たとえば_INFO_または_ERROR、_などのより高いレベルを設定できます。
ロギングレベルを設定するさまざまな方法を調べてみましょう。

*3. application.properties *のログ設定

テストで*ログレベルを*変更したい場合は、_src / test / resources / application.properties_に設定できるプロパティがあります。
logging.level.com.baeldung.testloglevel=DEBUG
このプロパティは、_com.baeldung.testloglevel_パッケージの*ログレベル*を*特別に設定*します。
同様に、すべてのパッケージのログレベルを変更するには、*ルートログレベルを設定します*:
logging.level.root=INFO
それでは、いくつかのログを書き込むRESTエンドポイントを追加して、ロギング設定を試してみましょう。
@RestController
public class TestLogLevelController {

    private static final Logger LOG = LoggerFactory.getLogger(TestLogLevelController.class);

    @Autowired
    private OtherComponent otherComponent;

    @GetMapping("/testLogLevel")
    public String testLogLevel() {
        LOG.trace("This is a TRACE log");
        LOG.debug("This is a DEBUG log");
        LOG.info("This is an INFO log");
        LOG.error("This is an ERROR log");

        otherComponent.processData();

        return "Added some log output to console...";
    }

}
予想どおり、tests__でこのエンドポイントを呼び出した場合、__ ** _ TestLogLevelController_から_DEBUG_ログ*を見ることができます。
2019-04-01 14:08:27.545 DEBUG 56585 --- [nio-8080-exec-1] c.b.testloglevel.TestLogLevelController  : This is a DEBUG log
2019-04-01 14:08:27.545  INFO 56585 --- [nio-8080-exec-1] c.b.testloglevel.TestLogLevelController  : This is an INFO log
2019-04-01 14:08:27.546 ERROR 56585 --- [nio-8080-exec-1] c.b.testloglevel.TestLogLevelController  : This is an ERROR log
2019-04-01 14:08:27.546  INFO 56585 --- [nio-8080-exec-1] c.b.component.OtherComponent  : This is an INFO log from another package
2019-04-01 14:08:27.546 ERROR 56585 --- [nio-8080-exec-1] c.b.component.OtherComponent  : This is an ERROR log from another package
このようにログレベルを設定するのは非常に簡単です。テストに_ @ SpringBootTest_という注釈が付けられている場合は、この方法で間違いなく行う必要があります。 ただし、その注釈を使用しない場合は、ログレベルを別の方法で構成する必要があります。

* 3.1。 プロファイルベースのロギング設定*

設定を__src / test / application.properties __に入れるとほとんどの状況で機能しますが、1つのテストまたはテストグループに対して異なる設定をしたい場合があります*。
その場合、* ActiveProfiles_アノテーションを使用して、https://www.baeldung.com/spring-profiles [Spring profile]をテストに追加できます*。
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT, classes = TestLogLevelApplication.class)
@EnableAutoConfiguration(exclude = SecurityAutoConfiguration.class)
@ActiveProfiles("logging-test")
public class TestLogLevelWithProfileIntegrationTest {

    // ...

}
ログ設定は、_src / test / resources_内の特別な_application-logging-test.properties_ fileにあります。
logging.level.com.baeldung.testloglevel=TRACE
logging.level.root=ERROR
説明した設定でテストから_TestLogLevelController_を呼び出すと、コントローラーから__TRACE __logsが表示され、他のパッケージから__INFO __logsがなくなります。
2019-04-01 14:08:27.545 DEBUG 56585 --- [nio-8080-exec-1] c.b.testloglevel.TestLogLevelController  : This is a DEBUG log
2019-04-01 14:08:27.545  INFO 56585 --- [nio-8080-exec-1] c.b.testloglevel.TestLogLevelController  : This is an INFO log
2019-04-01 14:08:27.546 ERROR 56585 --- [nio-8080-exec-1] c.b.testloglevel.TestLogLevelController  : This is an ERROR log
2019-04-01 14:08:27.546 ERROR 56585 --- [nio-8080-exec-1] c.b.component.OtherComponent  : This is an ERROR log from another package

4. ログバックの構成

Spring Bootでデフォルトで使用されるlink:/logback[Logback]を使用する場合、_src / test / resources内の_logback-test.xml_ファイル*でログレベルを設定できます。 _
<configuration>
    <include resource="/org/springframework/boot/logging/logback/base.xml"/>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
            </pattern>
        </encoder>
    </appender>
    <root level="error">
        <appender-ref ref="STDOUT"/>
    </root>
    <logger name="com.baeldung.testloglevel" level="debug"/>
</configuration>
上記の例は、テスト用のLogback構成でログレベルを設定する方法を示しています。 ルートログレベルは__INFO __に設定され、_com.baeldung.testloglevel_パッケージのログレベルは_DEBUG_に設定されます。
繰り返しますが、上記の設定を適用した後、出力を確認しましょう。
2019-04-01 14:08:27.545 DEBUG 56585 --- [nio-8080-exec-1] c.b.testloglevel.TestLogLevelController  : This is a DEBUG log
2019-04-01 14:08:27.545  INFO 56585 --- [nio-8080-exec-1] c.b.testloglevel.TestLogLevelController  : This is an INFO log
2019-04-01 14:08:27.546 ERROR 56585 --- [nio-8080-exec-1] c.b.testloglevel.TestLogLevelController  : This is an ERROR log
2019-04-01 14:08:27.546  INFO 56585 --- [nio-8080-exec-1] c.b.component.OtherComponent  : This is an INFO log from another package
2019-04-01 14:08:27.546 ERROR 56585 --- [nio-8080-exec-1] c.b.component.OtherComponent  : This is an ERROR log from another package

* 4.1。 プロファイルベースのログバック設定*

テスト用にプロファイル固有の設定をセットアップするもう1つの方法は、プロファイルの_application.properties_で__logging.config __propertyを設定することです。
logging.config=classpath:logback-testloglevel.xml
または、さらに別の言い方をすると、*クラスパスに単一のLogback構成を作成したい場合は、_logback.xml_で__springProfile __elementを使用することです:
<configuration>
    <include resource="/org/springframework/boot/logging/logback/base.xml"/>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
            </pattern>
        </encoder>
    </appender>
    <root level="error">
        <appender-ref ref="STDOUT"/>
    </root>
    <springProfile name="logback-test1">
        <logger name="com.baeldung.testloglevel" level="info"/>
    </springProfile>
    <springProfile name="logback-test2">
        <logger name="com.baeldung.testloglevel" level="trace"/>
    </springProfile>
</configuration>
ここで、プロファイル_logback-test1_を使用してテストで_TestLogLevelController_を呼び出すと、次の出力が得られます。
2019-04-01 14:08:27.545  INFO 56585 --- [nio-8080-exec-1] c.b.testloglevel.TestLogLevelController  : This is an INFO log
2019-04-01 14:08:27.546 ERROR 56585 --- [nio-8080-exec-1] c.b.testloglevel.TestLogLevelController  : This is an ERROR log
2019-04-01 14:08:27.546  INFO 56585 --- [nio-8080-exec-1] c.b.component.OtherComponent  : This is an INFO log from another package
2019-04-01 14:08:27.546 ERROR 56585 --- [nio-8080-exec-1] c.b.component.OtherComponent  : This is an ERROR log from another package
一方、プロファイルを_logback-test2_に変更すると、出力は次のようになります。
2019-04-01 14:08:27.545 DEBUG 56585 --- [nio-8080-exec-1] c.b.testloglevel.TestLogLevelController  : This is a DEBUG log
2019-04-01 14:08:27.545  INFO 56585 --- [nio-8080-exec-1] c.b.testloglevel.TestLogLevelController  : This is an INFO log
2019-04-01 14:08:27.546 ERROR 56585 --- [nio-8080-exec-1] c.b.testloglevel.TestLogLevelController  : This is an ERROR log
2019-04-01 14:08:27.546  INFO 56585 --- [nio-8080-exec-1] c.b.component.OtherComponent  : This is an INFO log from another package
2019-04-01 14:08:27.546 ERROR 56585 --- [nio-8080-exec-1] c.b.component.OtherComponent  : This is an ERROR log from another package

5. Log4Jの代替品

または、https://www.baeldung.com/log4j2-appenders-layouts-filters [Log4J2]を使用する場合、_src / test / resources:_内の_log4j2-spring.xml_ファイル*でログレベルを設定できます。
<Configuration>
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout
                    pattern="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n" />
        </Console>
    </Appenders>

    <Loggers>
        <Logger name="com.baeldung.testloglevel" level="debug" />

        <Root level="info">
            <AppenderRef ref="Console" />
        </Root>
    </Loggers>
</Configuration>
_application.properties_で__logging.config __propertyを設定することにより、__ Log4J __configurationのパスを設定できます。
logging.config=classpath:log4j-testloglevel.xml
最後に、上記の設定を適用した後、出力を確認しましょう。
2019-04-01 14:08:27.545 DEBUG 56585 --- [nio-8080-exec-1] c.b.testloglevel.TestLogLevelController  : This is a DEBUG log
2019-04-01 14:08:27.545  INFO 56585 --- [nio-8080-exec-1] c.b.testloglevel.TestLogLevelController  : This is an INFO log
2019-04-01 14:08:27.546 ERROR 56585 --- [nio-8080-exec-1] c.b.testloglevel.TestLogLevelController  : This is an ERROR log
2019-04-01 14:08:27.546  INFO 56585 --- [nio-8080-exec-1] c.b.component.OtherComponent  : This is an INFO log from another package
2019-04-01 14:08:27.546 ERROR 56585 --- [nio-8080-exec-1] c.b.component.OtherComponent  : This is an ERROR log from another package

6. 結論

この記事では、* Spring Bootアプリケーションのテスト時にログレベルを設定する方法*を学びました。 さまざまな設定方法を検討しました。
特に_ @ SpringBootTest_アノテーションを使用している場合、Spring Boot application.propertiesでログレベルを設定すること自体が最も簡単であることがわかりました。
いつものように、これらの例のソースコードはhttps://github.com/eugenp/tutorials/tree/master/spring-boot-testing[GitHub]にあります。