Добавление 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

Я понятия не имею, что означает эта ошибка и как ее решить. Кто-нибудь может мне помочь?

РЕДАКТИРОВАТЬ:

Я пытался сделать то, что сказал дрексин. Я не смог расширить интерфейс и определить функции. Было только три функции: 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 ответа

Решение

FileAppender имеет параметр типа class FileAppender[E], но вы создаете его экземпляр без предоставления такого параметра, поэтому Scala решает поставить Nothing в качестве типа. addAppender ожидает аппендиата типа Appender[ILoggingEvent]Вот что говорит ошибка. Что вам нужно сделать сейчас, это либо использовать существующий, либо создать свой собственный подкласс ILoggingEvent и предоставьте это как тип param:

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

val fileAppender = new FileAppender[MyLoggingEvent]()

Мой второй подход сработал. Теперь я могу видеть логи. Я делал ошибку в схеме. Это просто небольшой твик.

  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]])

Я подведу итоги всех моих усилий по автоматической регистрации / добавлению и выложу их в ближайшее время. Надеюсь, что это поможет и другим.

Другие вопросы по тегам