2

我在 Scala 版本 6.5.0 中使用Twitter 的日志记录框架。

我写了一个玩具用法示例:

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

这引发了两个问题:

  1. 尽管我清除了现有的处理程序,为什么其他一些处理程序也处理了我的警告消息?- 解决了
  2. 为什么,当我将记录器的级别设置为调试时,我在调试级别记录的消息没有得到处理?

如果有人能对这些问题中的任何一个有所了解,我将不胜感激。

4

2 回答 2

1

对于第一个问题,您可以更改代码以用于Logger.clearHandlers摆脱额外的处理程序。

第二个问题:您可以添加log.setLevel(Level.DEBUG)以获得您期望的输出。至于设置处理程序的级别做什么,它似乎没有控制任何东西。所以这是错误;至少他们的库中有一个文档错误。

于 2013-10-11T15:17:41.297 回答
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() 来注册新的处理程序。

但是,这个 main 方法的输出是:

TEST DEBUG> DEBUG LOG
TEST WARNING> WARNING LOG

这就是我一直在寻找的。

于 2013-10-14T09:36:57.373 回答