Добавление 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]])
Я подведу итоги всех моих усилий по автоматической регистрации / добавлению и выложу их в ближайшее время. Надеюсь, что это поможет и другим.