プログラムの挙動を確認するのにはlogger(ロガー)を使います。
Scalaで使えるロガーにはscala logging, twitter-util logging などがありますが、ここではもっとも手軽に使えるwvlet-logについて紹介します。
build.sbt
libraryDependencies += "org.wvlet" %% "wvlet-log" % "1.1"
MyApp.scala
wvlet.log.LogSupport
をクラスに追加します。
import wvlet.log._
object MyApp with LogSupport {
// ログのフォーマットを指定します
Logger.setDefaultFormatter(LogFormatter.SourceCodeLogFormatter)
info("log with source code")
}
出力
[MyApp] log with source code - (MyApp.scala:7)
より詳しい使い方はこちらを参考にしてください。フォーマットを指定することで、好みに応じてカラフルで詳細なログメッセージを出力することができます。
各種Loggerライブラリの違い
Scalaでのロギングにはバックエンドで使う実装の違いにより特徴が異なります。
slf4j
- プログラム中ではログレベルの設定を行わず、外部の設定ファイル(logback.xmlなど)を使います。
- slf4j-nop.jar (何も出力しない), logback-classic.jar (logbackを使う)などのslf4j用バインディングをライブラリに含めることでロガーの出力先を切り替えることができます。
- scala loggingは、slf4jをScalaから使うためのインターフェースを提供しています。
- インターフェースが単純なため、採用しているプロジェクトが多くあります。
- 利用者が多い反面、slf4jのバインディングをdependencyに含めているプロジェクトも多く(Hadoopなど)、出力先を適切に切り替えるため依存関係から不要なslf4jバインディングを取り除かなければならない傾向があります。
java.util.logging
- Javaのコアライブラリに含まれているため、slf4jのようにバインディングの実装を必要とせず、どんなプロジェクトでも使えます
- コード内でログレベルやフォーマットの設定ができるので自由度が高いです。Facebook Prestoなど大規模なプロジェクトでも使用されています。Twitter社の各種Scalaプロジェクトでも、twitter-util logging を通して使われています。
- wvlet-logもjava.util.loggingをベースに実装されています。ソースコードの行数を表示できるのでコードの実行箇所を確認しやすくなるのが大きな利点です。また、Scalaマクロを用いたコード生成を行うことで不必要なログメッセージを出力しない最適化がなされており、ロギングによる性能の劣化を気にせず使用することができます。