diff --git a/util/log/LoggerWriter.scala b/util/log/LoggerWriter.scala index 81c0d89d0..aeb67ce72 100644 --- a/util/log/LoggerWriter.scala +++ b/util/log/LoggerWriter.scala @@ -5,11 +5,13 @@ package sbt /** Provides a `java.io.Writer` interface to a `Logger`. Content is line-buffered and logged at `level`. * A line is delimited by `nl`, which is by default the platform line separator.*/ -class LoggerWriter(delegate: Logger, level: Level.Value, nl: String) extends java.io.Writer +class LoggerWriter(delegate: Logger, unbufferedLevel: Option[Level.Value], nl: String = System.getProperty("line.separator")) extends java.io.Writer { - def this(delegate: Logger, level: Level.Value) = this(delegate, level, System.getProperty("line.separator")) + def this(delegate: Logger, level: Level.Value) = this(delegate, Some(level)) + def this(delegate: Logger) = this(delegate, None) private[this] val buffer = new StringBuilder + private[this] val lines = new collection.mutable.ListBuffer[String] override def close() = flush() override def flush(): Unit = @@ -20,6 +22,12 @@ class LoggerWriter(delegate: Logger, level: Level.Value, nl: String) extends jav buffer.clear() } } + def flushLines(level: Level.Value): Unit = + synchronized { + for(line <- lines) + delegate.log(level, line) + lines.clear() + } override def write(content: Array[Char], offset: Int, length: Int): Unit = synchronized { buffer.appendAll(content, offset, length) @@ -36,5 +44,8 @@ class LoggerWriter(delegate: Logger, level: Level.Value, nl: String) extends jav process() } } - private[this] def log(s: String): Unit = delegate.log(level, s) + private[this] def log(s: String): Unit = unbufferedLevel match { + case None => lines += s + case Some(level) => delegate.log(level, s) + } } \ No newline at end of file