0

私はScalaBreezeのbreeze.optimizeパッケージを使用していますが、Breezeahsが独自のロギングライブラリを実装しているようです。

log4jやslf4jなどの標準ログを使用するようにBreezeを構成して、アプリケーションの他のすべてに対して行うのと同じ方法で最適化のログを構成できるようにする方法はありますか?

または、ログメッセージをオフにするにはどうすればよいですか。これらはデフォルトでオンになっており、関数最小化のすべての反復をログに記録します。これにより、多くのログノイズが発生します。

以下の回答に基づくApacheCommonsのラッパー:

import breeze.util.logging.Logger
import breeze.util.logging.Logger.Level
import org.apache.commons.logging.LogFactory

class BreezeCommonsLogger[T: ClassManifest] extends Logger {
    private val log = LogFactory.getLog(classManifest[T].erasure)

    def trace(f: => Any) { if (log.isTraceEnabled()) log.trace(f.toString) }
    def debug(f: => Any) { if (log.isDebugEnabled()) log.debug(f.toString) }
    def info(f: => Any) { if (log.isInfoEnabled()) log.info(f.toString) }
    def warn(f: => Any) { if (log.isWarnEnabled()) log.warn(f.toString) }
    def error(f: => Any) { if (log.isErrorEnabled()) log.error(f.toString) }
    def fatal(f: => Any) { if (log.isFatalEnabled()) log.fatal(f.toString) }
    def level_=(level: Level) {}
    def level = Logger.NEVER
}

私はこれを次のように使用することができました:

val lbfgs = new LBFGS[Mat](maxIters, 5, tolerance) {
    override val log = new BreezeCommonsLogger[LBFGS[Mat]]
}
4

1 に答える 1

1

最適化クラスlogにタイプがのメンバー変数があることに注意してくださいbreeze.util.logging.Logger。ロギングメッセージをオフにするために、と呼ばれる提供されたクラスがありますbreeze.util.logging.NullLogger。デフォルトを上書きするには、次のlogようにします。

val opt = new breeze.optimize.OWLQN { 
  override val log = breeze.util.logging.NullLogger
}

OWLQNこれにより、オプティマイザーに対してすべてを同じに保つ匿名クラスが作成され、ロギングがなくなります。

log4jやslf4jなどの代替ロギングソースを使用するという点では、暗黙の変換を使用してlog4jロガーからBreezeロガーに変換するか、から継承するクラスでロガーをラップすることを検討してくださいLogger

于 2013-02-22T16:05:44.493 に答える