添加Appender不起作用

时间:2012-10-01 19:23:40

标签: scala logging logback appender fileappender

我正在尝试获取一个记录器并为其添加一个特定的appender。我的代码非常简单,但我不确定如何使用它。

val loggerInstance = LoggerFactory.getLogger("FOO.class")
var fileAppender =  new FileAppender()
// fileAppender .setFile , sietPattern etc..the parameters i want
loggerInstance.addAppender(fileAppender) 

我在这里收到错误

Multiple markers at this line
- type mismatch; found : ch.qos.logback.core.FileAppender[Nothing] required: 
     ch.qos.logback.core.Appender[ch.qos.logback.classic.spi.ILoggingEvent] Note: Nothing <: 
     ch.qos.logback.classic.spi.ILoggingEvent, but Java-defined trait Appender is invariant in type E. You may wish to investigate a 
     wildcard type such as `_ <: ch.qos.logback.classic.spi.ILoggingEvent`. (SLS 3.2.10)
    - Line breakpoint:loggerchange [line: 76] - addAppender

我不知道这个错误意味着什么,以及如何解决它。有人能帮助我吗?

编辑:

我试着去做drexin所说的话。我无法扩展界面并定义功能。只有三个函数,setName,getName和doAppend。我不确定如何定义这些功能。同时我尝试了一些东西并删除了错误。请查看代码,让我知道我正在做什么是有道理的。

val encoder = new PatternLayoutEncoder()
encoder2.setContext(context)
encoder2.setPattern("%msg%")    
fileAppender.setAppend(true)
fileAppender.setContext(context)
fileAppender.setEncoder(encoder2.asInstanceOf[Encoder[Nothing]])

loggerInstance.asInstanceOf[Logger].addAppender(fileAppender
.asInstanceOf[Appender[ILoggingEvent]])

我知道使用asInstanceOf不是一种聪明的编码方式,但是现在我想让这项工作成功。当我执行此代码时,我得到了我想要记录的文件,但里面没有日志。我检查过级别错误,但事实并非如此。我相信编码器/布局有问题。我不知道如何解决它。有人可以告诉我如何扩展类并应用这些新代码中的函数或错误。

2 个答案:

答案 0 :(得分:2)

FileAppender有一个类型参数class FileAppender[E],但是你实例化它而不提供这样的参数,因此scala决定将Nothing作为类型放入。 addAppender期望一个Appender[ILoggingEvent]类型的追加器,这就是错误所说的。你现在要做的是要么使用现有的,要么创建自己的ILoggingEvent子类并将其作为类型参数提供:

class MyLoggingEvent extends ILoggingEvent {
  // implement ALL the methods
}

val fileAppender = new FileAppender[MyLoggingEvent]()

答案 1 :(得分:0)

我的第二种方法奏效了。我现在能够看到日志。我在模式中犯了错误。这只是一个小小的调整。

  val encoder = new PatternLayoutEncoder()
  encoder.setContext(context)
  encoder.setPattern("%msg%n")    
  fileAppender.setAppend(true)
  fileAppender.setContext(context)
  fileAppender.setEncoder(encoder.asInstanceOf[Encoder[Nothing]])

  loggerInstance.asInstanceOf[Logger].addAppender(fileAppender
  .asInstanceOf[Appender[ILoggingEvent]])

我将总结我自动记录/追加的所有努力,并尽快将其提出来。希望这也能帮助别人。