我在Scala中使用Twitter's logging framework,版本6.5.0。
我写了一个玩具用法示例:
import com.twitter.logging._
object TestFormatter extends Formatter
{
override def format( record : java.util.logging.LogRecord) = "TEST %s> ".format( record.getLevel.getName ) + formatText(record) + lineTerminator
}
object Main extends App
{
override def main( args : Array[String] ) : Unit =
{
// obtain a logger
val log = Logger.get( getClass )
// clear any existing message handlers
Logger.clearHandlers
// add a new handler, using my toy formatter
log.addHandler( ConsoleHandler( TestFormatter, Some( Level.DEBUG ) )() )
// log a couple of test messages
log.debug( "DEBUG LOG" )
log.warning( "WARNING LOG" )
}
}
类TestFormatter不是必需的,但有助于突出我的问题。我很确定通过这段代码的输出我应该从中看到的是:
TEST DEBUG> DEBUG LOG
TEST WARNING> WARNING LOG
然而,我实际得到的是:
TEST WARNING> WARNING LOG
WARNING: WARNING LOG
这提出了两个问题:
如果有人可以对这些问题中的任何一个有所了解,我将非常感激。
答案 0 :(得分:1)
对于第一个问题,您可以更改代码以使用Logger.clearHandlers
来删除其他处理程序。
第二个问题:您可以添加log.setLevel(Level.DEBUG)
以获得您期望的输出。至于处理程序的级别设置,它似乎没有控制任何东西。所以它是bug;至少是他们库中的文档错误。
答案 1 :(得分:1)
事实证明,我没有以预期的方式使用框架。我发现LoggerFactory类是您应该对记录器进行更改的方式。我的主要方法应该如下:
override def main( args : Array[String] ) : Unit =
{
val log = Logger.get( "" )
LoggerFactory(
node = "",
level = Some( Level.DEBUG ),
handlers = List( ConsoleHandler( TestFormatter, Some( Level.DEBUG ) ) )
).apply()
log.debug( "DEBUG LOG" )
log.warning( "WARNING LOG" )
}
我仍然不完全确定为什么原始代码不起作用,特别是因为LoggerFactory的来源似乎暗示它通过调用addHandler()来注册新的Handler。
但是,这个主要方法的输出是:
TEST DEBUG> DEBUG LOG
TEST WARNING> WARNING LOG
这就是我想要的。