mirror of https://github.com/sbt/sbt.git
logging cleanup
This commit is contained in:
parent
77be505093
commit
54c84e35c3
|
|
@ -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 }
|
||||||
}
|
}
|
||||||
|
|
@ -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,32 +35,35 @@ 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)
|
||||||
|
if(recording)
|
||||||
buffer += new SetLevel(newLevel)
|
buffer += new SetLevel(newLevel)
|
||||||
|
else
|
||||||
delegate.setLevel(newLevel)
|
delegate.setLevel(newLevel)
|
||||||
}
|
}
|
||||||
def setSuccessEnabled(flag: Boolean)
|
override def setSuccessEnabled(flag: Boolean): Unit = synchronized {
|
||||||
{
|
super.setSuccessEnabled(flag)
|
||||||
|
if(recording)
|
||||||
buffer += new SetSuccess(flag)
|
buffer += new SetSuccess(flag)
|
||||||
|
else
|
||||||
delegate.setSuccessEnabled(flag)
|
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)
|
buffer += new SetTrace(level)
|
||||||
|
else
|
||||||
delegate.setTrace(level)
|
delegate.setTrace(level)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -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)
|
||||||
|
|
@ -90,3 +92,4 @@ class BufferedLogger(delegate: AbstractLogger) extends AbstractLogger
|
||||||
doUnbuffered(delegate)
|
doUnbuffered(delegate)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
@ -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)
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue