Scalaでなにか書く時はLogbackというライブラリを使ってログ出力するようにしているのですが、こいつがいつも単体テスト実行時にもログ出力されてしまっていたのでそれを抑える方法。

出力されるログについて


こんな感じでログが表示されます。これがテストの実行結果の間に挟まって表示されるので、失敗した場合にコンソールをスクロールして確認するのが手間でした。

1
2
3
4
5
6
20:38:51,322 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback-test.xml]
20:38:51,322 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.groovy]
20:38:51,323 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Found resource [logback.xml] at [file:/C:/Scala/example/server/target/scala-2.12/classes/logback.xml]
20:38:51,437 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - debug attribute not set
20:38:51,439 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.rolling.RollingFileAppender]
20:38:51,462 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [APPLICATION_FILE]

対応


で、上のログを見て頂くとわかるのですが、テスト実行時ははじめにlogback-test.xmlというファイルを見に行っているのがわかります。これがない場合はlogback.xmlを見に行きます。これは下記のドキュメントに書かれている通りです。

logback の設定

これでいくと、テスト用にlogback-test.xmlというファイルを準備して、そこにログ出力しない旨を設定すればよいという予想が付きます。実際にステータスメッセージの待ち受けという項目で下記のような記述があります。

logback の配布物にはいくつかのステータスリスナー実装が含まれています。OnConsoleStatusListener は、受け取ったステータスメッセージを、コンソール(例えばSystem.out)に出力します。OnErrorConsoleStatusListener は、受け取ったステータスメッセージをSystem.errに出力します。NopStatusListenerは、受け取ったステータスメッセージをそのまま捨ててしまいます。

というわけでstatusListenerNopStatusListenerを指定すればよさそうです。で、作ったlogback-test.xmlが下記のものです。

1
2
3
<configuration>
<statusListener class="ch.qos.logback.core.status.NopStatusListener" />
</configuration>

こいつをsrc/test/resources直下に放り込みます。

実行してみる


上記のファイルを放り込んだ状態でテストを実行した結果、出力されるのは下記3行のみになりました。

1
2
3
SLF4J: A number (1) of logging calls during the initialization phase have been intercepted and are
SLF4J: now being replayed. These are subject to the filtering rules of the underlying logging system.
SLF4J: See also http://www.slf4j.org/codes.html#replay

これをどうやって消せばいいのかはちょっとまだわかっていないのですが、もともと40行くらい出力されていたのが3行になったのでとりあえず良しとしたいです。

おわり。