sbtテスト実行時におけるエラーメッセージの短縮表示方法

http://d.hatena.ne.jp/a-hisame/20100715/1279183871
ここで「sbtのテストエラー時のメッセージは例外のスタックトレースなので長い。何か良い方法は無いのかしら」と書いていたが、簡単(だが、あまり汎用的ではない)解決法を見つけたので記述しておく。
メッセージはプロジェクト内のLoggerに書き出されているので、そのメッセージを強制的に変更してしまうことで、この問題を解決する。具体的には以下のようなProjectファイルを使う。

// sbt version 0.7.4
import sbt._

class MyProject(info: ProjectInfo) extends DefaultProject(info) {
  val scalaTest = "org.scalatest" % "scalatest" % "1.0"

  protected override def logImpl: Logger = {
    val lg = new BufferedLogger(
      new ConsoleLogger {
        override def trace(t: => java.lang.Throwable) = {
	  if( t.toString.indexOf("org.scalatest") != -1 ) {
            printLog("failed", t.toString)
	  } else {
            super.trace(t)
	  }
        }

	def printLog(label: => String, message: => String) { 
	  System.out.synchronized {
            System.out.print("[%s] %s".format(label, message))
	    System.out.println()
	  }
	}
      }
    )
    lg.setLevel(defaultLoggingLevel)
    lg
  }
}

使用するloggerはProjectファイルのlogImplをoverrideして差し込むことで差し替えされる。
従来のソースコードでは、BufferedLoggerにinfo.logを差し込んでいたが、info.logはConsoleLoggerだったので、それを使わずに、新たにLoggerを作っておいた。
自分で使う限りでは、Console上に出力されるだけなので、困らないし。


この中でテストのトレースをするのがtraceメソッド。
ここで全てのtraceを書き換えると他の例外(例えばrun実行時の例外)のトレースまで表示されなくなるので、使用するテストフレームワークのテストの表示のみを短縮表示することにした。


ハードコーディングだけれど、別に自分で使う分にはいいよね。