Scala 自定义外部记录器未在sbt中获取[成功]消息?

Scala 自定义外部记录器未在sbt中获取[成功]消息?,scala,sbt,Scala,Sbt,我使用以下代码连接到SBT的日志系统,将日志消息发送到另一个进程,该进程可通过服务器设置访问: extraLoggers := { val clientLogger = FullLogger { new Logger { def log(level: Level.Value, message: => String): Unit = if(level >= Level.Info) server.value.send(Json.arr("print

我使用以下代码连接到SBT的日志系统,将日志消息发送到另一个进程,该进程可通过
服务器
设置访问:

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)
}
当我查看在另一个
服务器上输出的输出时,我没有看到显示绿色
[success]
标记的消息。其他所有信息(即所有
[info]
消息和红色
[error]
消息)都显示正常

打印出
clientLogger.successEnabled
会给我
true


我做错了什么?

免责声明:请小心使用,因为答案可能不完整,甚至完全错误

咨询后,我的理解是,
外部记录器
是一个仅为的设置,而这些
附加记录器
是附加的

如果可能的话,您必须在
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
是一个密封特性,因此无法在定义的文件之外使用它

话虽如此,我相信,在
sbt0.13.1
中,当
showsucture
true
时,不可能“截获”打印出来的
[success]
消息,因为它来自您无法控制的
ConsoleOut

使用
extraLoggers
可以对任务进行自定义日志记录,
streams.value.log.success(“succeezz”)
应该可以工作

示例
build.sbt
,带有
extrallogger
和演示自定义记录器的
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

我使用一个自定义任务测试了您的
外部记录器
,该任务会吐出
streams.value.log.success(“succeezz”)
,它运行良好-使用
message
输入参数调用了相应的
success
实现。那可能是
server.value.send
不适用于所有级别吗?!如何测试
外部记录器
服务器.value.send
有效,您认为
流.value.log.success
有效是正确的。我怀疑问题在于我所期望的成功(即
[success]编译耗时5秒
消息)没有通过
外部记录器传递,这反映了我的情绪。额外的日志记录程序会为
log
消息收集,但不知何故
showSuccess
showTiming
不会通过日志记录程序。我正在寻找消息来源以确认。