Подтвердить что ты не робот

Пользовательский extraLogger не получает [успешные] сообщения в sbt?

Я использую следующий код, чтобы подключиться к системе ведения журнала SBT, чтобы отправить сообщения журнала в другой процесс, доступный с помощью параметра server:

extraLoggers := {
  val clientLogger = FullLogger {
    new Logger {
      def log(level: Level.Value, message: => String): Unit =
        if(level >= Level.Info) server.value.send(Json.arr("print", level.toString(), message))
      def success(message: => String): Unit = server.value.send(Json.arr("print", "info", message))
      def trace(t: => Throwable): Unit = server.value.send(Json.arr("print", "error", t.toString))
    }
  }
  val currentFunction = extraLoggers.value
  (key: ScopedKey[_]) => clientLogger +: currentFunction(key)
}

Когда я смотрю на вывод, вырванный из другого процесса server, я не вижу сообщений с зелеными тегами [success]. Все остальное (т.е. Все сообщения [info] и красные сообщения [error]) выглядят просто отлично.

Распечатка clientLogger.successEnabled дает мне true.

Что я делаю неправильно?

4b9b3361

Ответ 1

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ. Пожалуйста, используйте с осторожностью, поскольку ответ может быть неполным или даже совершенно неправильным.

После консультаций с источниками sbt я понимаю, что extraLoggers - это параметр, который является "Функция, которая предоставляет дополнительные регистраторы для заданной настройки." и эти additional loggers являются дополнительными к стандартуMain.console.

Если бы это было возможно, вам пришлось бы установить logManager ссылку на extraLoggers и свой собственный sbt.ConsoleOut в build.sbt, например

logManager := LogManager.defaults(extraLoggers.value, new ConsoleOut {
  val lockObject = System.out
  def print(s: String): Unit = synchronized { print(s) }
  def println(s: String): Unit = synchronized { println(s) }
  def println(): Unit = synchronized {
    System.out.println()
  }
})

Однако он не будет работать, поскольку sbt.ConsoleOut является запечатанным признаком и, следовательно, нет возможности использовать его за пределами файла, который был определен.

Сказав, что, по-моему, в sbt 0.13.1 невозможно "перехватить" сообщение [success], которое было напечатано, когда showSuccess есть true, поскольку он выходит из ConsoleOut, который находится вне вашего контроля.

Что вы можете сделать с extraLoggers, так это иметь собственное собственное ведение журнала для задач и streams.value.log.success("Succezz") должно работать.

Образец build.sbt с задачей extraLoggers и t для демонстрации пользовательского регистратора.

extraLoggers := {
  val clientLogger = FullLogger {
    new Logger {
      def log(level: Level.Value, message: => String): Unit =
        if(level >= Level.Info) println(s"+++ $message at $level")
      def success(message: => String): Unit = println(s"+++ success: $message")
      def trace(t: => Throwable): Unit = println(s"+++ trace: throwable: $t")
    }
  }
  val currentFunction = extraLoggers.value
  (key: ScopedKey[_]) => clientLogger +: currentFunction(key)
}

val t = taskKey[Unit]("Show extraLoggers")

t := {
  println(s"Using extraLoggers")
  val s: TaskStreams = streams.value
  val log = s.log
  log.debug("Saying hi...")
  log.info("Hello!")
  log.error("Error")
  log.success("Succezz")
}

С файлом выполнение задачи t дает следующий результат:

$ sbt
[info] Loading global plugins from /Users/jacek/.sbt/0.13/plugins
[info] Loading project definition from /Users/jacek/sandbox/sbt-0.13.1-extra-loggers/project
[info] Set current project to sbt-0-13-1-extra-loggers (in build file:/Users/jacek/sandbox/sbt-0.13.1-extra-loggers/)
[sbt-0-13-1-extra-loggers]> about
[info] This is sbt 0.13.1
[info] The current project is {file:/Users/jacek/sandbox/sbt-0.13.1-extra-loggers/}sbt-0-13-1-extra-loggers 0.1-SNAPSHOT
[info] The current project is built against Scala 2.10.3
[info] Available Plugins: com.typesafe.sbt.SbtGit, com.typesafe.sbt.SbtProguard, growl.GrowlingTests, org.sbtidea.SbtIdeaPlugin, np.Plugin, com.timushev.sbt.updates.UpdatesPlugin
[info] sbt, sbt plugins, and build definitions are using Scala 2.10.3
[sbt-0-13-1-extra-loggers]> t
Using extraLoggers
[info] Hello!
+++ Hello! at info
[error] Error
+++ Error at error
[success] Succezz
+++ success: Succezz
[success] Total time: 0 s, completed Dec 16, 2013 10:30:48 PM