diff --git a/project/AddLogTimestamps.scala b/project/AddLogTimestamps.scala new file mode 100644 index 0000000000..82f9f81a54 --- /dev/null +++ b/project/AddLogTimestamps.scala @@ -0,0 +1,67 @@ +package akka + +import java.io.PrintWriter +import java.time.LocalDateTime +import java.time.ZoneId +import java.time.format.DateTimeFormatter + +import sbt._ +import Keys._ +import sbt.Def +import sbt.internal.LogManager +import sbt.internal.util.ConsoleOut + +object AddLogTimestamps extends AutoPlugin { + val enableTimestamps: Boolean = CliOption("akka.log.timestamps", false).get + + override def requires: Plugins = plugins.JvmPlugin + override def trigger: PluginTrigger = allRequirements + + private val UTC = ZoneId.of("UTC") + + override def projectSettings: Seq[Def.Setting[_]] = { + logManager := { + val original = logManager.value + + if (enableTimestamps) { + val myOut = new PrintWriter(System.out) { + val dateTimeFormat = DateTimeFormatter.ofPattern("MM-dd HH:mm:ss.SSS") + var lastWasNewline = true + + override def print(s: String): Unit = { + maybePrintTimestamp() + + super.print(s) + + lastWasNewline = s.endsWith("\n") + } + + override def println(): Unit = { + super.println() + lastWasNewline = true + } + + override def println(x: String): Unit = { + maybePrintTimestamp() + + super.println(x) + lastWasNewline = true + } + + private def maybePrintTimestamp(): Unit = + if (lastWasNewline) { + super.print('[') + super.print(dateTimeFormat.format(LocalDateTime.now(UTC))) + super.print("] ") + lastWasNewline = false + } + } + + val myLogger = ConsoleOut.printWriterOut(myOut) + + LogManager.defaults(extraLoggers.value, myLogger) + } else + original + } + } +} diff --git a/project/MultiNode.scala b/project/MultiNode.scala index cdc8b090bf..120022f1bf 100644 --- a/project/MultiNode.scala +++ b/project/MultiNode.scala @@ -5,7 +5,8 @@ package akka import akka.TestExtras.Filter.Keys._ -import com.typesafe.sbt.{ SbtScalariform, SbtMultiJvm } +import com.typesafe.sbt.MultiJvmPlugin.MultiJvmKeys.multiJvmCreateLogger +import com.typesafe.sbt.{SbtMultiJvm, SbtScalariform} import com.typesafe.sbt.SbtMultiJvm.MultiJvmKeys._ import com.typesafe.sbt.SbtScalariform.ScalariformKeys import sbt._ @@ -60,7 +61,20 @@ object MultiNode extends AutoPlugin { jvmOptions in MultiJvm := defaultMultiJvmOptions, compileInputs in (MultiJvm, compile) := ((compileInputs in (MultiJvm, compile)) dependsOn (ScalariformKeys.format in MultiJvm)).value, scalacOptions in MultiJvm := (scalacOptions in Test).value, - compile in MultiJvm := ((compile in MultiJvm) triggeredBy (compile in Test)).value) ++ + compile in MultiJvm := ((compile in MultiJvm) triggeredBy (compile in Test)).value, + logLevel in multiJvmCreateLogger := Level.Debug, // to see ssh establishment + multiJvmCreateLogger in MultiJvm := { // to use normal sbt logging infra instead of custom sbt-multijvm-one + val previous = (multiJvmCreateLogger in MultiJvm).value + val logger = streams.value.log + (name: String) => + new Logger { + def trace(t: => Throwable) { logger.trace(t) } + def success(message: => String) { success(message) } + def log(level: Level.Value, message: => String): Unit = + logger.log(level, s"[${scala.Console.BLUE}$name${scala.Console.RESET}] $message") + } + } + ) ++ CliOptions.hostsFileName.map(multiNodeHostsFileName in MultiJvm := _) ++ CliOptions.javaName.map(multiNodeJavaName in MultiJvm := _) ++ CliOptions.targetDirName.map(multiNodeTargetDirName in MultiJvm := _) ++