diff options
author | Li Haoyi <haoyi.sg@gmail.com> | 2018-05-22 19:34:21 -0700 |
---|---|---|
committer | Li Haoyi <haoyi.sg@gmail.com> | 2018-05-22 19:50:18 -0700 |
commit | 6e60ce3d921a9b5e4ced628e2014b707ce2bbbee (patch) | |
tree | 05739c9d3c528ac9d0b4950eb25f43204ceaebde /core | |
parent | 7358b3c9ecd38cb0d8e268dc7b83156b813a7065 (diff) | |
download | mill-6e60ce3d921a9b5e4ced628e2014b707ce2bbbee.tar.gz mill-6e60ce3d921a9b5e4ced628e2014b707ce2bbbee.tar.bz2 mill-6e60ce3d921a9b5e4ced628e2014b707ce2bbbee.zip |
optimize output streaming to allow batch writes
Diffstat (limited to 'core')
-rw-r--r-- | core/src/mill/util/Logger.scala | 66 |
1 files changed, 50 insertions, 16 deletions
diff --git a/core/src/mill/util/Logger.scala b/core/src/mill/util/Logger.scala index dfa7964a..ec8de132 100644 --- a/core/src/mill/util/Logger.scala +++ b/core/src/mill/util/Logger.scala @@ -145,24 +145,58 @@ case class FileLogger(colored: Boolean, file: Path) extends Logger { } } -case class MultiLogger(colored: Boolean, streams: Logger*) extends Logger { - lazy val outputStream: PrintStream = - new PrintStream(b => streams.foreach(_.outputStream.write(b))) { - override def flush() = streams.foreach(_.outputStream.flush()) - override def close() = streams.foreach(_.outputStream.close()) - } - lazy val errorStream: PrintStream = - new PrintStream(b => streams.foreach(_.outputStream.write(b))) { - override def flush() = streams.foreach(_.outputStream.flush()) - override def close() = streams.foreach(_.outputStream.close()) - } - lazy val inStream = streams.collect{case t: PrintLogger => t}.headOption match{ + + +class MultiStream(stream1: OutputStream, stream2: OutputStream) extends PrintStream(new OutputStream { + def write(b: Int): Unit = { + stream1.write(b) + stream2.write(b) + } + override def write(b: Array[Byte]): Unit = { + stream1.write(b) + stream2.write(b) + } + override def write(b: Array[Byte], off: Int, len: Int) = { + stream1.write(b, off, len) + stream2.write(b, off, len) + } + override def flush() = { + stream1.flush() + stream2.flush() + } + override def close() = { + stream1.close() + stream2.close() + } +}) + +case class MultiLogger(colored: Boolean, logger1: Logger, logger2: Logger) extends Logger { + + + lazy val outputStream: PrintStream = new MultiStream(logger1.outputStream, logger2.outputStream) + + lazy val errorStream: PrintStream = new MultiStream(logger1.errorStream, logger2.errorStream) + + lazy val inStream = Seq(logger1, logger2).collectFirst{case t: PrintLogger => t} match{ case Some(x) => x.inStream case None => new ByteArrayInputStream(Array()) } - def info(s: String) = streams.foreach(_.info(s)) - def error(s: String) = streams.foreach(_.error(s)) - def ticker(s: String) = streams.foreach(_.ticker(s)) - override def close() = streams.foreach(_.close()) + def info(s: String) = { + logger1.info(s) + logger2.info(s) + } + def error(s: String) = { + logger1.error(s) + logger2.error(s) + } + def ticker(s: String) = { + logger1.ticker(s) + logger2.ticker(s) + } + + override def close() = { + logger1.close() + logger2.close() + } }
\ No newline at end of file |