logging cleanup

This commit is contained in:
Mark Harrah 2011-05-07 22:02:06 -04:00
parent 77be505093
commit 54c84e35c3
3 changed files with 47 additions and 34 deletions

View File

@ -9,10 +9,10 @@ abstract class BasicLogger extends AbstractLogger
private var traceEnabledVar = java.lang.Integer.MAX_VALUE private var traceEnabledVar = java.lang.Integer.MAX_VALUE
private var level: Level.Value = Level.Info private var level: Level.Value = Level.Info
private var successEnabledVar = true private var successEnabledVar = true
def successEnabled = successEnabledVar def successEnabled = synchronized { successEnabledVar }
def setSuccessEnabled(flag: Boolean) { successEnabledVar = flag } def setSuccessEnabled(flag: Boolean): Unit = synchronized { successEnabledVar = flag }
def getLevel = level def getLevel = synchronized { level }
def setLevel(newLevel: Level.Value) { level = newLevel } def setLevel(newLevel: Level.Value): Unit = synchronized { level = newLevel }
def setTrace(level: Int) { traceEnabledVar = level } def setTrace(level: Int): Unit = synchronized { traceEnabledVar = level }
def getTrace = traceEnabledVar def getTrace = synchronized { traceEnabledVar }
} }

View File

@ -13,21 +13,19 @@ package sbt
* *
* This class assumes that it is the only client of the delegate logger. * This class assumes that it is the only client of the delegate logger.
* */ * */
class BufferedLogger(delegate: AbstractLogger) extends AbstractLogger class BufferedLogger(delegate: AbstractLogger) extends BasicLogger
{ {
private[this] val buffer = new ListBuffer[LogEvent] private[this] val buffer = new ListBuffer[LogEvent]
private[this] var recording = false private[this] var recording = false
/** Enables buffering. */ /** Enables buffering. */
def record() = { recording = true } def record() = synchronized { recording = true }
def buffer[T](f: => T): T = def buffer[T](f: => T): T = synchronized {
{
record() record()
try { f } try { f }
finally { stopQuietly() } finally { stopQuietly() }
} }
def bufferQuietly[T](f: => T): T = def bufferQuietly[T](f: => T): T = synchronized {
{
record() record()
try try
{ {
@ -37,33 +35,36 @@ class BufferedLogger(delegate: AbstractLogger) extends AbstractLogger
} }
catch { case e => stopQuietly(); throw e } catch { case e => stopQuietly(); throw e }
} }
private def stopQuietly() = try { stop() } catch { case e: Exception => () } def stopQuietly() = synchronized { try { stop() } catch { case e: Exception => () } }
/** Flushes the buffer to the delegate logger. This method calls logAll on the delegate /** Flushes the buffer to the delegate logger. This method calls logAll on the delegate
* so that the messages are written consecutively. The buffer is cleared in the process. */ * so that the messages are written consecutively. The buffer is cleared in the process. */
def play() { delegate.logAll(buffer.readOnly); buffer.clear() } def play(): Unit = synchronized { delegate.logAll(buffer.readOnly); buffer.clear() }
/** Clears buffered events and disables buffering. */ /** Clears buffered events and disables buffering. */
def clear(): Unit = { buffer.clear(); recording = false } def clear(): Unit = synchronized { buffer.clear(); recording = false }
/** Plays buffered events and disables buffering. */ /** Plays buffered events and disables buffering. */
def stop() { play(); clear() } def stop(): Unit = synchronized { play(); clear() }
def setLevel(newLevel: Level.Value) override def setLevel(newLevel: Level.Value): Unit = synchronized {
{ super.setLevel(newLevel)
buffer += new SetLevel(newLevel) if(recording)
delegate.setLevel(newLevel) buffer += new SetLevel(newLevel)
else
delegate.setLevel(newLevel)
} }
def setSuccessEnabled(flag: Boolean) override def setSuccessEnabled(flag: Boolean): Unit = synchronized {
{ super.setSuccessEnabled(flag)
buffer += new SetSuccess(flag) if(recording)
delegate.setSuccessEnabled(flag) buffer += new SetSuccess(flag)
else
delegate.setSuccessEnabled(flag)
} }
def successEnabled = delegate.successEnabled override def setTrace(level: Int): Unit = synchronized {
def getLevel = delegate.getLevel super.setTrace(level)
def getTrace = delegate.getTrace if(recording)
def setTrace(level: Int) buffer += new SetTrace(level)
{ else
buffer += new SetTrace(level) delegate.setTrace(level)
delegate.setTrace(level)
} }
def trace(t: => Throwable): Unit = def trace(t: => Throwable): Unit =
@ -72,16 +73,17 @@ class BufferedLogger(delegate: AbstractLogger) extends AbstractLogger
doBufferable(Level.Info, new Success(message), _.success(message)) doBufferable(Level.Info, new Success(message), _.success(message))
def log(level: Level.Value, message: => String): Unit = def log(level: Level.Value, message: => String): Unit =
doBufferable(level, new Log(level, message), _.log(level, message)) doBufferable(level, new Log(level, message), _.log(level, message))
def logAll(events: Seq[LogEvent]): Unit = def logAll(events: Seq[LogEvent]): Unit = synchronized {
if(recording) if(recording)
buffer ++= events buffer ++= events
else else
delegate.logAll(events) delegate.logAll(events)
}
def control(event: ControlEvent.Value, message: => String): Unit = def control(event: ControlEvent.Value, message: => String): Unit =
doBufferable(Level.Info, new ControlEvent(event, message), _.control(event, message)) doBufferable(Level.Info, new ControlEvent(event, message), _.control(event, message))
private def doBufferable(level: Level.Value, appendIfBuffered: => LogEvent, doUnbuffered: AbstractLogger => Unit): Unit = private def doBufferable(level: Level.Value, appendIfBuffered: => LogEvent, doUnbuffered: AbstractLogger => Unit): Unit =
doBufferableIf(atLevel(level), appendIfBuffered, doUnbuffered) doBufferableIf(atLevel(level), appendIfBuffered, doUnbuffered)
private def doBufferableIf(condition: => Boolean, appendIfBuffered: => LogEvent, doUnbuffered: AbstractLogger => Unit): Unit = private def doBufferableIf(condition: => Boolean, appendIfBuffered: => LogEvent, doUnbuffered: AbstractLogger => Unit): Unit = synchronized {
if(condition) if(condition)
{ {
if(recording) if(recording)
@ -89,4 +91,5 @@ class BufferedLogger(delegate: AbstractLogger) extends AbstractLogger
else else
doUnbuffered(delegate) doUnbuffered(delegate)
} }
}
} }

View File

@ -4,8 +4,9 @@
package sbt package sbt
/** Promotes the simple Logger interface to the full AbstractLogger interface. */ /** Promotes the simple Logger interface to the full AbstractLogger interface. */
class FullLogger(delegate: Logger, override val ansiCodesSupported: Boolean = false) extends BasicLogger class FullLogger(delegate: Logger) extends BasicLogger
{ {
override val ansiCodesSupported: Boolean = delegate.ansiCodesSupported
def trace(t: => Throwable) def trace(t: => Throwable)
{ {
if(traceEnabled) if(traceEnabled)
@ -23,3 +24,12 @@ class FullLogger(delegate: Logger, override val ansiCodesSupported: Boolean = fa
info(message) info(message)
def logAll(events: Seq[LogEvent]): Unit = events.foreach(log) def logAll(events: Seq[LogEvent]): Unit = events.foreach(log)
} }
object FullLogger
{
def apply(delegate: Logger): AbstractLogger =
delegate match
{
case d: AbstractLogger => d
case _ => new FullLogger(delegate)
}
}