1

我正在尝试获取记录器并向其添加特定的附加程序。我的代码非常简单,但我不知道如何让它工作。

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

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

编辑 :

我试着按照德雷辛所说的去做。我无法扩展接口并定义功能。只有三个函数,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 不是一种聪明的编码方式,但现在我想完成这项工作。当我执行这段代码时,我得到了我想要登录的文件,但里面没有日志。我检查了级别错误,但事实并非如此。我相信编码器/布局有问题。我不知道如何解决它。有人可以告诉我如何扩展类和应用函数或者这个新代码有什么问题吗?

4

2 回答 2

2

FileAppender一个类型参数class FileAppender[E],但是您在没有提供这样的参数的情况下实例化它,因此 scala 决定将Nothing其作为类型放入。addAppender需要一个类型的附加程序Appender[ILoggingEvent],这就是错误所说的。您现在要做的是使用现有的,或者创建您自己的子类ILoggingEvent并将其作为类型参数提供:

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

val fileAppender = new FileAppender[MyLoggingEvent]()
于 2012-10-01T19:42:31.753 回答
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]])

我将总结我在自动记录/附加方面所做的所有努力,并尽快提出。希望这也会对其他人有所帮助。

于 2012-10-01T23:17:40.923 回答