add extraLoggers to make it easier to add loggers

This commit is contained in:
Mark Harrah 2011-06-22 19:17:10 -04:00
parent 5d0cdc8de4
commit 738e32b9c6
4 changed files with 10 additions and 5 deletions

View File

@ -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(

View File

@ -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.")

View File

@ -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

View File

@ -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)