From 738e32b9c664ea0d82b27c2580025b7387c19064 Mon Sep 17 00:00:00 2001 From: Mark Harrah Date: Wed, 22 Jun 2011 19:17:10 -0400 Subject: [PATCH] add extraLoggers to make it easier to add loggers --- main/Defaults.scala | 2 ++ main/Keys.scala | 1 + main/LogManager.scala | 11 ++++++----- util/log/Level.scala | 1 + 4 files changed, 10 insertions(+), 5 deletions(-) diff --git a/main/Defaults.scala b/main/Defaults.scala index fb2a45817..cf84612cd 100644 --- a/main/Defaults.scala +++ b/main/Defaults.scala @@ -62,6 +62,7 @@ object Defaults extends BuildCommon credentials :== Nil, scalaHome :== None, javaHome :== None, + extraLoggers :== { _ => Nil }, version :== "0.1", outputStrategy :== None, exportJars :== false, @@ -90,6 +91,7 @@ object Defaults extends BuildCommon )) def projectCore: Seq[Setting[_]] = Seq( name <<= thisProject(_.id), + logManager <<= extraLoggers(LogManager.defaults), runnerSetting ) def paths = Seq( diff --git a/main/Keys.scala b/main/Keys.scala index 9f7231430..393ae43f6 100644 --- a/main/Keys.scala +++ b/main/Keys.scala @@ -26,6 +26,7 @@ object Keys val showSuccess = SettingKey[Boolean]("show-success", "If true, displays a success message after running a command successfully.") val showTiming = SettingKey[Boolean]("show-timing", "If true, the command success message includes the completion time.") val timingFormat = SettingKey[java.text.DateFormat]("timing-format", "The format used for displaying the completion time.") + val extraLoggers = SettingKey[ScopedKey[_] => Seq[AbstractLogger]]("extra-loggers", "A function that provides additional loggers for a given setting.") val logManager = SettingKey[LogManager]("log-manager", "The log manager, which creates Loggers for different contexts.") val logBuffered = SettingKey[Boolean]("log-buffered", "True if logging should be buffered until work completes.") diff --git a/main/LogManager.scala b/main/LogManager.scala index 1421b0709..9be6760fa 100644 --- a/main/LogManager.scala +++ b/main/LogManager.scala @@ -17,6 +17,7 @@ object LogManager manager(data, task, to) } lazy val default: LogManager = withLoggers() + def defaults(extra: ScopedKey[_] => Seq[AbstractLogger]): LogManager = withLoggers(extra = extra) def defaultScreen: AbstractLogger = ConsoleLogger() def defaultBacked(useColor: Boolean): PrintWriter => AbstractLogger = @@ -24,13 +25,13 @@ object LogManager def withScreenLogger(mk: => AbstractLogger): LogManager = withLoggers(mk) - def withLoggers(screen: => AbstractLogger = defaultScreen, backed: PrintWriter => AbstractLogger = defaultBacked(ConsoleLogger.formatEnabled)): LogManager = + def withLoggers(screen: => AbstractLogger = defaultScreen, backed: PrintWriter => AbstractLogger = defaultBacked(ConsoleLogger.formatEnabled), extra: ScopedKey[_] => Seq[AbstractLogger] = _ => Nil): LogManager = new LogManager { def apply(data: Settings[Scope], task: ScopedKey[_], to: PrintWriter): Logger = - defaultLogger(data, task, screen, backed(to)) + defaultLogger(data, task, screen, backed(to), extra(task).toList) } - def defaultLogger(data: Settings[Scope], task: ScopedKey[_], console: AbstractLogger, backed: AbstractLogger): Logger = + def defaultLogger(data: Settings[Scope], task: ScopedKey[_], console: AbstractLogger, backed: AbstractLogger, extra: List[AbstractLogger]): Logger = { val scope = task.scope def getOr[T](key: AttributeKey[T], default: T): T = data.get(scope, key) getOrElse default @@ -39,9 +40,9 @@ object LogManager val screenTrace = getOr(traceLevel.key, -1) val backingTrace = getOr(persistTraceLevel.key, Int.MaxValue) - val multi = new MultiLogger(console :: backed :: Nil) + val multi = new MultiLogger(console :: backed :: extra) // sets multi to the most verbose for clients that inspect the current level - multi setLevel Level.union(backingLevel, screenLevel) + multi setLevel Level.unionAll(backingLevel :: screenLevel :: extra.map(_.getLevel)) // set the specific levels console setLevel screenLevel backed setLevel backingLevel diff --git a/util/log/Level.scala b/util/log/Level.scala index 62fb5f2c2..f501cd40c 100644 --- a/util/log/Level.scala +++ b/util/log/Level.scala @@ -16,6 +16,7 @@ object Level extends Enumeration val SuccessLabel = "success" def union(a: Value, b: Value) = if(a.id < b.id) a else b + def unionAll(vs: Seq[Value]) = vs reduceLeft union /** Returns the level with the given name wrapped in Some, or None if no level exists for that name. */ def apply(s: String) = values.find(s == _.toString)