mirror of https://github.com/sbt/sbt.git
Restore binary compatibility for LogManager.defaults
Although log manager is in the internal package, akka uses it and it seems worth preserving binary compatibility in their build, at least for sbt 1.4.0-M2. Once the community build is passing, we can consider reverting this.
This commit is contained in:
parent
8b5f212010
commit
74e407f4a1
|
|
@ -27,7 +27,7 @@ import sbt.internal.io.WatchState
|
||||||
import sbt.internal.librarymanagement.{ CompatibilityWarningOptions, IvySbt }
|
import sbt.internal.librarymanagement.{ CompatibilityWarningOptions, IvySbt }
|
||||||
import sbt.internal.remotecache.RemoteCacheArtifact
|
import sbt.internal.remotecache.RemoteCacheArtifact
|
||||||
import sbt.internal.server.ServerHandler
|
import sbt.internal.server.ServerHandler
|
||||||
import sbt.internal.util.{ Appender, AttributeKey, ProgressState, SourcePosition }
|
import sbt.internal.util.{ AttributeKey, ProgressState, SourcePosition }
|
||||||
import sbt.io._
|
import sbt.io._
|
||||||
import sbt.librarymanagement.Configurations.CompilerPlugin
|
import sbt.librarymanagement.Configurations.CompilerPlugin
|
||||||
import sbt.librarymanagement.LibraryManagementCodec._
|
import sbt.librarymanagement.LibraryManagementCodec._
|
||||||
|
|
@ -61,7 +61,7 @@ object Keys {
|
||||||
val timingFormat = settingKey[java.text.DateFormat]("The format used for displaying the completion time.").withRank(CSetting)
|
val timingFormat = settingKey[java.text.DateFormat]("The format used for displaying the completion time.").withRank(CSetting)
|
||||||
@deprecated("", "1.4.0")
|
@deprecated("", "1.4.0")
|
||||||
val extraLoggers = settingKey[ScopedKey[_] => Seq[XAppender]]("A function that provides additional loggers for a given setting.").withRank(DSetting)
|
val extraLoggers = settingKey[ScopedKey[_] => Seq[XAppender]]("A function that provides additional loggers for a given setting.").withRank(DSetting)
|
||||||
val extraAppenders = settingKey[ScopedKey[_] => Seq[Appender]]("A function that provides additional loggers for a given setting.").withRank(DSetting)
|
val extraAppenders = settingKey[AppenderSupplier]("A function that provides additional loggers for a given setting.").withRank(DSetting)
|
||||||
val useLog4J = settingKey[Boolean]("Toggles whether or not to use log4j for sbt internal loggers.").withRank(Invisible)
|
val useLog4J = settingKey[Boolean]("Toggles whether or not to use log4j for sbt internal loggers.").withRank(Invisible)
|
||||||
val logManager = settingKey[LogManager]("The log manager, which creates Loggers for different contexts.").withRank(DSetting)
|
val logManager = settingKey[LogManager]("The log manager, which creates Loggers for different contexts.").withRank(DSetting)
|
||||||
private[sbt] val loggerContext = AttributeKey[LoggerContext]("sbt-logger-context", "The logger config which creates Loggers for different contexts.", Int.MaxValue)
|
private[sbt] val loggerContext = AttributeKey[LoggerContext]("sbt-logger-context", "The logger config which creates Loggers for different contexts.", Int.MaxValue)
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,7 @@ import sbt.Scope.GlobalScope
|
||||||
import sbt.internal.util.MainAppender._
|
import sbt.internal.util.MainAppender._
|
||||||
import sbt.internal.util._
|
import sbt.internal.util._
|
||||||
import sbt.util.{ Level, LogExchange, Logger, LoggerContext }
|
import sbt.util.{ Level, LogExchange, Logger, LoggerContext }
|
||||||
|
import org.apache.logging.log4j.core.{ Appender => XAppender }
|
||||||
|
|
||||||
sealed abstract class LogManager {
|
sealed abstract class LogManager {
|
||||||
def apply(
|
def apply(
|
||||||
|
|
@ -44,6 +45,14 @@ sealed abstract class LogManager {
|
||||||
backgroundLog(data, state, task, LoggerContext.globalContext)
|
backgroundLog(data, state, task, LoggerContext.globalContext)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A functional interface that allows us to preserve binary compatibility
|
||||||
|
* for LogManager.defaults with the old log4j variant.
|
||||||
|
*/
|
||||||
|
trait AppenderSupplier {
|
||||||
|
def apply(s: ScopedKey[_]): Seq[Appender]
|
||||||
|
}
|
||||||
|
|
||||||
object LogManager {
|
object LogManager {
|
||||||
import java.util.concurrent.atomic.AtomicInteger
|
import java.util.concurrent.atomic.AtomicInteger
|
||||||
private val generateId: AtomicInteger = new AtomicInteger
|
private val generateId: AtomicInteger = new AtomicInteger
|
||||||
|
|
@ -75,8 +84,14 @@ object LogManager {
|
||||||
def defaultManager(console: ConsoleOut): LogManager =
|
def defaultManager(console: ConsoleOut): LogManager =
|
||||||
withLoggers((_, _) => defaultScreen(console))
|
withLoggers((_, _) => defaultScreen(console))
|
||||||
|
|
||||||
|
@deprecated(
|
||||||
|
"use defaults that takes AppenderSupplier instead of ScopedKey[_] => Seq[Appender]",
|
||||||
|
"1.4.0"
|
||||||
|
)
|
||||||
|
def defaults(extra: ScopedKey[_] => Seq[XAppender], console: ConsoleOut): LogManager =
|
||||||
|
defaults((sk: ScopedKey[_]) => extra(sk).map(new ConsoleAppenderFromLog4J("extra", _)), console)
|
||||||
// This is called by Defaults.
|
// This is called by Defaults.
|
||||||
def defaults(extra: ScopedKey[_] => Seq[Appender], console: ConsoleOut): LogManager =
|
def defaults(extra: AppenderSupplier, console: ConsoleOut): LogManager =
|
||||||
withLoggers(
|
withLoggers(
|
||||||
(task, state) => defaultScreen(console, suppressedMessage(task, state)),
|
(task, state) => defaultScreen(console, suppressedMessage(task, state)),
|
||||||
extra = extra
|
extra = extra
|
||||||
|
|
@ -89,14 +104,14 @@ object LogManager {
|
||||||
screen: (ScopedKey[_], State) => Appender = (_, s) => defaultScreen(s.globalLogging.console),
|
screen: (ScopedKey[_], State) => Appender = (_, s) => defaultScreen(s.globalLogging.console),
|
||||||
backed: PrintWriter => Appender = defaultBacked,
|
backed: PrintWriter => Appender = defaultBacked,
|
||||||
relay: Unit => Appender = defaultRelay,
|
relay: Unit => Appender = defaultRelay,
|
||||||
extra: ScopedKey[_] => Seq[Appender] = _ => Nil
|
extra: AppenderSupplier = _ => Nil
|
||||||
): LogManager = new DefaultLogManager(screen, backed, relay, extra)
|
): LogManager = new DefaultLogManager(screen, backed, relay, extra)
|
||||||
|
|
||||||
private class DefaultLogManager(
|
private class DefaultLogManager(
|
||||||
screen: (ScopedKey[_], State) => Appender,
|
screen: (ScopedKey[_], State) => Appender,
|
||||||
backed: PrintWriter => Appender,
|
backed: PrintWriter => Appender,
|
||||||
relay: Unit => Appender,
|
relay: Unit => Appender,
|
||||||
extra: ScopedKey[_] => Seq[Appender]
|
extra: AppenderSupplier
|
||||||
) extends LogManager {
|
) extends LogManager {
|
||||||
def apply(
|
def apply(
|
||||||
data: Settings[Scope],
|
data: Settings[Scope],
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue