Scala 自定义外部记录器未在sbt中获取[成功]消息?
我使用以下代码连接到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
服务器
设置访问:
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
不会通过日志记录程序。我正在寻找消息来源以确认。