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の3つの関数しかありませんでした。これらの関数を定義する方法がわかりません。その間、私は何かを試し、エラーを削除しました。コードを調べて、私がやっていることには意味があるかどうか教えてください。

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それをタイプ param として提供することです。

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

val fileAppender = new FileAppender[MyLoggingEvent]()
于 2012-10-01T19:42:31.753 に答える
0

私の 2 番目のアプローチはうまくいきました。ログを表示できるようになりました。パターンを間違えていました。それはちょっとした微調整です。

  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 に答える